PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme beim HTML indexen mit Apache Lucene


Senior Sanchez
2010-05-07, 10:52:17
Hiho,

Für ein Uni-Projekt lasse ich einige hundert HTML Seiten mit Apache Lucene indexen. Dummerweise sind die HTML Seiten aber nicht valide, dass heißt da sind öfters leichte syntaktische Fehler drin (die Firefox, Safari und Co aber ignorieren bzw. ausbügeln können). Lucene kommt damit aber gar nicht klar. Es schmeißt ständig "Parse Aborted Meldungen".

Hier mein Code:


Analyzer analyser;
analyser = new StandardAnalyzer(Version.LUCENE_30);

try {
this.writer = new IndexWriter(this.IndexDir, analyser,MaxFieldLength.LIMITED);

for (File file : this.files) {
this.writer.addDocument(HTMLDocument.Document(file));
this.writer.commit();
}
this.writer.close();
}
catch(Exception e) {
e.printStackTrace();
}


this.files enthält die zu indizierenden HTML-Dokumente.

Hat irgendjemand eine Idee, wie ich Lucene robuster hinbekomme?

Ganz auf Lucene verzichten geht auch nicht, da wir keine Lust haben, die TFIDF-Funktion nach zu implementieren. ;)

HajottV
2010-05-07, 12:28:12
Hallo,

HTML Seiten sind selten valide. Also erstmal bereinigen... z.B. per TagSoup (http://home.ccil.org/~cowan/XML/tagsoup/) oder Cobra (http://lobobrowser.org/). TagSoup ist leichtgewichtiger, Cobra kann auch Javascript.

Mit TagSoup (einfach das JAR runterladen) müsste das Ganze so aussehen - ist jetzt aus dem Kopf programmiert also ohne Garantie -:



final private static SAXBuilder sSaxBuilder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser");

...

writer = new IndexWriter(this.IndexDir, analyser,MaxFieldLength.LIMITED);

for (File file : this.files) {
Document document = sSaxBuilder.build(file);
XMLOutputter xmlOutputter = new XMLOutputter();
ByteArrayOutputStream fufu = new ByteArrayOutputStream();
xmlOutputter.output(doc, fufu);
writer.addDocument(HTMLDocument.Document(new ByteArrayInputStream(fufu.toByteArray())));
}
writer.commit(); /* am ende commiten == wenig Segmente == gut */
writer.close();



Und mach das this weg, das ist bäbä... :tongue:

Gruß

Jörg

Senior Sanchez
2010-05-07, 12:34:54
Ah, danke!

Das schaue ich mir mal an.

Und nein, dass this bleibt. So sehe ich gleich, was eine Instanzvariable ist und was Variable im aktuellen Block. ;)

Senior Sanchez
2010-05-07, 12:47:55
Auch wenn ich das this-Schlüsselblock mag: Wenn das nicht auf den ersten Blick sowieso ersichtlich ist, sind deine Blöcke zu groß. ;(

Nein nein, so meine ich das nicht. Manchmal, egal wie groß ein Block ist, ist für mich nicht sofort ersichtlich, ob es sich bei einer Variablen um eine Instanzvariable oder z.B. einen Parameter der Methode handelt. Wenn ein this davor steht sehe ich das aber sofort und es erspart mir ein Nachschauen in der Methodensignatur.

Gast
2010-05-09, 05:05:45
Das die HTML Dateien nicht valide sind, ist nicht das Problem von Lucene sondern von dem verwendeten Parser.
Du kann aber mal das Subprojekt Tika ausprobieren. http://lucene.apache.org/tika/

Senior Sanchez
2010-05-09, 11:53:46
Hmm, werde ich auch mal schauen.

Ich denke aber mal ein "aufräumen" der Seiten ist anfangs leichter. Ich meine, dass es am Parser liegt war ja klar, aber da dieser ein Teil von Lucene ist, habe ich jetzt einfach mal Lucene komplett die Schuld gegeben.