Nutch, Droids, Tika

Apache Lucene: Futter für den Index

Bernd Fondermann

Das Finetuning des Ergebnis-Rankings ist eine schöne Beschäftigung für Suchmaschinenadministratoren. Entscheidend für das Ergebnis ist aber, was in den Index reingesteckt wurde. Die letzte Folge unserer Serie über die Lucene-Produktfamilie beschäftigt sich deshalb mit dem Anfang des Prozesses: Text sammeln als Indexfutter.

Zurecht kann man den Autor dieser kleinen Lucene-Staffelung schelten, dass er das Pferd von hinten aufzäume; steht doch die Bereitstellung von Text eigentlich am Beginn des Suchprozesses und ein leerer Index wird kaum zu einer Fülle von Treffern führen. Aber soll man sich das Schönste nicht für zuletzt aufheben? Als Wiedergutmachung beschäftigen wir uns diesmal gleich mit drei Lucene-Produkten auf einmal.

In a Nutchshell

Von Apache Nutch ist am 23. März dieses Jahres die Version 1.0 herausgekommen, vorher war jahrelang Version 0.9 im Einsatz. Nutch durchforstet Webseiten, um daraus einen Suchindex aufzubauen. Ehre, wem Ehre gebührt: Nutch ist auch die Keimzelle, aus der Apache Hadoop hervorgegangen ist, seinerseits mittlerweile ein sehr erfolgreiches Projekt mit vielen Produkten.

Hadoop dient Nutch als Speicherunterbau. Es stellt ein verteiltes Dateisystem zur Verfügung, in dem Nutch die von ihm besuchten Webseiten speichert. Dieses Dateisystem, „HDFS“ genannt, kann bis in dreistellige Terabyte-Größenordnungen skalieren – vorausgesetzt, man hat so viele Maschinen mit dem entsprechenden Plattenplatz. Der Index von Nutch ist also auf Größe angelegt; beim Abgrasen des Internets kann schließlich so einiges zusammenkommen.

Um den Speicher von Nutch mit Webseiten zu füllen, steht ein so genannter Crawler zur Verfügung. Dieser Batch-Job besucht und speichert, ausgehend von einer Startseite, Teile des Internets oder ein Intranet. Dabei folgt er auch Links auf andere Webseiten und spannt auf diese Weise ein Teilnetz des World Wide Web auf, weshalb Jobs dieser Art auch „Spider“ genannt werden. Aus dem von Spider besuchten textuellen Inhalt wird alles für eine Suche Relevante extrahiert (Tags, CSS und JavaScript werden aussortiert) und mit Lucene indiziert.

Die von Nutch erzeugten Lucene Documents (siehe den zweiten Teil der Serie) haben die in Tabelle 1 dargestellten Felder.

Feldname

Bedeutung

title

Titel der Seite, wie in der Kopfzeile des Browsers dargestellt

url

Server, von dem die Seite gelesen wurde

content

Indizierter Inhalt

anchor

Auf diese Seite verlinkende andere Seiten

tstamp

Wann wurde die Seite indiziert?

Tabelle 1: Von Nutch gespeicherte Felder (Auswahl)

Als Abfrage-Frontend liefert Nutch ein WAR-File mit, das dazu geeignet ist, in jedem Tomcat oder Jetty deployt zu werden. Es stellt eine Oberfläche bereit, wie sie von den gängigen Onlinesuchmaschinen bekannt ist, inklusive Vorschau der Webseiten aus lokalem Cache, Textausschnitt aus der Webseite mit hervorgehobenen Treffern und auf die Seite verlinkenden Seiten (Abb. 1). Das ist schon eine stattliche Ansammlung von Features für ein Open-Source-Projekt.

Abb. 1: Suchergebnis

Die Roboter kommen?

Ein recht junges Projekt aus der vielseitigen Lucene-Familie ist Apache Droids. Es befindet sich derzeit im Apache Incubator, der obligatorischen Zwischenstation auf dem Weg zu einem vollwertigen Apache-Projekt.

Droids fordert wieder den ganzen Java-Programmierer. Es stellt ein jobbasiertes Framework zur Verfügung, um einen Crawler zu implementieren. Es zielt also auf ähnliche Anwendungsfälle wie Nutch, ist allerdings durch die Möglichkeit und Notwendigkeit, selbst Hand anzulegen, wesentlich flexibler in der Umsetzung.

Im Kern besteht Droids aus einer Batch-Job-Verwaltung. Jede Droid-Klasse verwaltet einen bestimmten Typ von Job. Der CrawlingDroid zum Beispiel erhält eine Liste von URLs zum Runterladen der dahinter stehenden Inhalte. Beim Start erzeugt der Droide eine TaskManager-Instanz, die wiederum für jeden URL einen Task erzeugt. Die Tasks können sequenziell oder parallel ablaufen. Die Abarbeitung jedes Tasks beinhaltet den Zugriff auf die Ressource und gegebenenfalls die Weiterverarbeitung der Inhalte. Ein Parser-Objekt ist dafür zuständig. Ein anderer mitgelieferter Droide ist der FileRenameDroid, der viele Dateien in einem Lauf umbenennen kann. Das Anwendungsfeld von Droids geht also über das Crawling allein hinaus.

Die Dokumentation von Apache Droids ist noch nicht so weit gediehen, als dass man das Framework ohne Studium des Quellcodes einsetzen kann. Auch ein offizielles Release lässt noch auf sich warten. Droids bedient sich übrigens für das Parsen von Dokumenten auch des letzten Kandidaten in unserem Reigen, Apache Tika.

[ header = Seite 2: Der Dokumenten-Dietrich]

Der Dokumenten-Dietrich

Apache Tika schließt fast jedes Dokument auf. Angelehnt an seinen Erfinder, den mittlerweile in Basel lebenden Jukka Zitting, könnte man es auch das Schweizer Taschenmesser für Textextraktion nennen. Dabei bedient es sich vieler spezialisierter Werkzeuge, sprich: Libraries, um alle erdenklichen Filetypen zu verarbeiten.

Doch unterschiedliche Filetypen gibt es wie Sand am Meer. Wenn man sich alleine vergegenwärtigt, mit wie vielen verschiedenen Office-Filetypen wir über die Jahre und Anwendungsbereiche beglückt wurden. Wie findet man da den richtigen Schlüssel?

Typischerweise gibt es zwei Herangehensweisen: Dateiendung und Magic Bytes. Endet ein Filename auf .doc oder .jpg, wird es sich dabei höchstwahrscheinlich nicht um Musik handeln. Viele Dateitypen enthalten in den ersten paar Bytes noch eine Kennung des Formats (Java-Classfiles zum Beispiel 0xCA, 0xFE, 0xBA, 0xBE in den ersten vier Bytes). Somit lässt sich das Format auch noch korrekt erkennen, wenn die Endung falsch oder verloren ist.

Tika unterstützt eine stattliche Liste von einschlägigen Dokumententypen. Für jeden stellt es einen dedizierten Parser zur Verfügung, der automatisch von Tika herangezogen wird.

Extraktion

Um ein Dokument zu parsen und seine textuellen Informationen aufzusammeln, hat sich Tika beim XML SAX Parser bedient: Über einen ContentHandler wird ein Event generiert, sobald eine semantische Einheit wie eine Überschrift oder ein Mengentext beginnt oder endet. Auf diese Events kann der Prozess, der den Parser steuert, reagieren, als ob er ein XML- oder HTML-Dokument verarbeiten würde. In Wirklichkeit ist es aber ein Microsoft Word Dokument oder ein PDF. Auf diese Weise kommt man also an den Text, den Inhalt.

Die meisten Dokumente enthalten weitere Informationen, die mindestens genauso interessant wie der Inhalt sein können: Autor, Erstellungsdatum, Sprache, Titel… und diese Informationen sind oft vom Dateityp abhängig: Ein MP3-File hat einen Komponisten, ein Word-Dokument einen Autor. Tika definiert einige oft verwendete Metadaten vor: Dublin Core, Creative Commons, Microsoft-Office-Attribute…

Ein Tika-Parser bekommt als Input die Binärdaten des Dokument, sowie gegebenenfalls beim Zugriff anfallende Metadaten übergeben. Er generiert während des kontinuierlichen Lesens („Streaming“) ContentHandler-Ereignisse und sammelt weitere typspezifische Metadaten ein.

Diese drei Dinge zusammen (Dokument-Binärdaten, ContentHandler und Metadaten) bilden das simple Parser-Interface von Apache Tika:

public interface Parser {

void parse(InputStream stream, ContentHandler handler, Metadata metadata)
throws IOException, SAXException, TikaException;

}
Doc-Spiele

Doch eine eigene Implementierung ist in der Regel gar nicht notwendig. Zur einfachen Demonstration laden wir die Quellen von Apache Tika 0.3 von der Tika-Website herunter und entpacken das Paket. Zum Bauen brauchen wir mindestens eine Java-5-Umgebung und eine aktuelle Installation von Apache Maven 2. Mit mvn package erhalten wir nach Abschluss des Builds die fertigen Tika JARs im Ordner target/. Ein java -cp target/tika-0.3-standalone.jar org.apache.tika.gui.TikaGUI startet nun eine einfache Oberfläche. Mit einem eleganten Drag’n’Drop lassen sich Tika nun Dokumente zuführen. Sie können nun legal OpenOffice- oder Microsoft-Office-Dokumente einsehen, ohne die entsprechenden Pakete zu erwerben. Ein Tipp: Lassen Sie doch mal ein Java-Classfile in den Tika-Dialog plumpsen, oder ein MP3 File, wie in Abbildung 2.

Abb. 2: Tika-Dialog

Fazit

Für die Verarbeitung von Dokumenten, die Text enthalten, seien sie nun als Dateien auf der lokalen Festplatte oder als Downloads aus dem Internet verfügbar, bietet das Apache Lucene Projekt mächtige und flexible Tools an. Tools, die auch für Anwendungsfälle außerhalb von Lucene konzipiert und geeignet sind.

Geschrieben von
Bernd Fondermann
Bernd Fondermann
Bernd Fondermann (bernd.fondermann@brainlounge.de) ist freiberuflicher Softwarearchitekt und Consultant in Frankfurt a. M. Er hat eine Schwäche für verteilte Systeme und Datenspeicher, die ohne SQL abgefragt werden können. Als Member der Apache Software Foundation versucht er, mit der Vielzahl der Incubator-Projekte dort schrittzuhalten.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.