Web-Seite indexieren

Di_to

Grünschnabel
Hallo ihr Lieben!
Ich habe wahrscheinlich eher ein kleines Problem, kann es aber mit meinen fast nicht mehr vorhandenem Java-Grundkenntnissen nicht lösen und bin schon am verzweifeln...
Ich muss eine Webseite indexieren. Im Seminar haben wir das auch schon gemacht, allerdings mit txt-Dateien. Ich habe also versucht in den untenstehenden Code irgendwie HTMLDocument zu verwenden, weil es sich für mich am sinnvollsten anhört. Nur hab ich das Problem das ich keine Ahnung habe wie.. Kann mir jemand helfen? Oder wenigstens einen Tipp geben wie ich das anstellen kann...? Vielen Dank im Vorraus. Di_to



Code:
/*
 * Created on 01.02.2012

 */

import org.apache.lucene.index.*; 
import org.apache.lucene.document.*; 
//import org.apache.lucene.analysis.*;
//import org.apache.lucene.analysis.de.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.*; 
import org.apache.lucene.util.Version;

import java.io.IOException;
import java.io.File;
import java.io.FileReader;

/**
 * @author Ma
 */
public class stkurs2 {

	public static void main(String[] args) {

		System.out.println ("Start ...");

		/// Index erzeugen und initialisieren

		try {
			File indexfile = new File ("index_test"); 
			File docdir = new File ("texte");

			Directory indexDir = FSDirectory.open(indexfile);
			StandardAnalyzer analyzer =  new StandardAnalyzer (Version.valueOf ("LUCENE_35"));
			IndexWriterConfig conf = new IndexWriterConfig (Version.valueOf ("LUCENE_35"), analyzer );
			IndexWriter iwriter = new IndexWriter (indexDir, conf);

			/// Dokumente hinzufuegen 

			File[] files = docdir.listFiles();
			String docText[] = new String[files.length];

			if (files != null) { // Erforderliche Berechtigungen etc. sind vorhanden
				for (int i = 0; i < files.length; i++) {
					if (files[i].isDirectory()) {
						System.out.print(" (Ordner)\n");
					}
					else {
						System.out.println("Datei wird gelesen: ");
						System.out.println(files[i].getAbsolutePath()+"\n");

						try {

							FileReader fr = new FileReader(files[i]);
							char[] content = new char[(int)files[i].length()];
							fr.read(content);
							System.out.println(String.valueOf(content));
							docText[i] = (String.valueOf(content));
						}
						catch (IOException e) {
							e.printStackTrace();
						}	

					}
				}
			}



			for (int d=0;  d<files.length	; d++){
				Document doc = new Document ();
				Field f = new Field ("text", docText[d], Field.Store.YES, Field.Index.ANALYZED ); /// was passier hier?
				doc.add(f);
				iwriter.addDocument (doc);
			}

			iwriter.close() ; 
			System.out.println ("Fertig");


	    // Anfrage
	    String querystr = args.length > 0 ? args[0] : "bank";

	    // the "title" arg specifies the default field to use
	    // when no field is explicitly specified in the query.

	    Query q = new QueryParser(Version.valueOf ("LUCENE_35"), "text", analyzer).parse(querystr);

	    // Suche 
	    int hitsPerPage = 10;
	    
	    IndexReader reader = IndexReader.open(indexDir);
	    IndexSearcher searcher = new IndexSearcher(reader);
	    TopScoreDocCollector collector = 
	    TopScoreDocCollector.create(hitsPerPage, true);
	    searcher.search(q, collector);
	    ScoreDoc[] hits = collector.topDocs().scoreDocs;
	    
	    // Ergebnisse anzeigen
	    System.out.println("Gefundene Dokumente " + hits.length );
	    for(int i=0;i<hits.length;++i) {
	      int docId = hits[i].doc;
	      Document d = searcher.doc(docId);
	      System.out.println((i + 1) + ". " + d.get("text"));
	    }

	    searcher.close();
	  
	}
	catch (Exception e)
	{
		System.out.println ("Fehler in Klasse " + e.getClass() + "\n: " + e.getMessage() );
	}

		
		
	}
}
 
Ich habe noch nie mit Lucene gearbeitet, daher entschuldige mich, wenn ich mich nachfolgend irre...

Bei HTML-Dokumenten kannst du die obige Logik nicht 1:1 übernehmen, da nicht der Komplette Text zur Indexierung verwendet werden darf, sonst würden verwendete Tags die Indexierung verfälschen. Aus diesem Grund solltest du dir im Vornherein überlegen welche Inhalte relevant sind und ggf. welche Gewichtung diese haben. Zur Extrahierung ist ein HTML-Parser vorteilhaft.

Wenn wir nun beispielsweise von der Standard-Struktur ausgehen:
HTML:
<html>
  <head>
    <title>Titel</title>
  </head>
  <body>
    <p>Inhalt</p>
  </body>
</html>

Dann sind hier "Titel" und "Inhalt" von Interesse, du benötigst hier 2 verschiedene Field, die du dem Document hinzufügst.
 
Zurück