Apache Lucene
Übersicht
Bei Lucene handelt es sich, objektorientiert gesprochen, um ein Suchmaschinen-Framework. Ein solches gibt typischerweise lediglich die Grobarchitektur einer Applikation vor. Lucene verhält sich da nicht anders und stellt nur die Mittel für die Kernaufgaben zur Verfügung, Detailaspekte sind Sache der Entwickler und hängen vom Anwendungsszenario ab. Wie die Herkunft aus dem Umfeld von „Apache Jakarta“ bereits erahnen lässt, ist Lucene komplett in Java geschrieben.
Geschichte
Doug Cutting, der Erfinder von Lucene, ist in der Welt des Information Retrieval kein Unbekannter. So zeichnet Cutting verantwortlich für den Index-Kern von Apples Suchhilfe „Sherlock“. Beim Suchmaschinenbetreiber eXite war er maßgeblicher Architekt der hauseigenen Technik. Die erste Idee zu Lucene kam ihm 1997, erste Prototypen waren 1998 verfügbar. Mit Lucenes Umzug 2001 von Sourceforge unter das Dach der Apache Foundation war vor allem die Hoffnung verknüpft, dass Lucene eine breitere Öffentlichkeit erreichen würde und die Weiterentwicklung des Projekts gesichert sei. Seit Mitte Februar 2005 ist Lucene ein Top-Level-Apache-Projekt.
Dateiformate
Für die Indexierung stellt Lucene Klassen und Methoden bereit, um Dokumente zu analysieren, zu indexieren und zu speichern. Im Grunde kann alles verarbeitet werden, was in Textform vorliegt, also beispielsweise ASCII-Dateien, Datenbankfelder oder E-Mails. Wer Inhalte in Formaten wie HTML, PDF, Microsoft Word oder OpenOffice verarbeiten möchte, benötigt Filter, die textuelle Informationen extrahieren. Sie sind wegen der erwähnten Framework-Architektur jedoch nicht integraler Bestandteil von Lucene, sondern über diverse andere Projekte verfügbar (PDFBox für PDF, JTidy beziehungsweise NekoHTML für HTML, Apache POI für Microsoft Word etc.).
Textanalyse
Wenn die eigentlichen Textinhalte vorliegen, werden sie einem so genannten Analyzer übergeben. Die Daten werden nach fest definierten Regeln zerlegt und in einer einheitlichen Weise für den Index aufbereitet. Dabei können Stoppwörter eliminiert oder Zeichenketten in Kleinschreibung normalisiert werden. Für einfache Aufgaben bringt Lucene einige Simple Analyzer mit. Für komplexere Analyseschritte wie die linguistische Aufbereitung des Textkörpers kann an dieser Stelle ein entsprechendes Tool eingeklinkt werden. Einen passenden Analyzer vorausgesetzt, lassen sich mit Lucene übrigens auch hierzulande ungewohnte Zeichensätze, wie sie im Chinesischen oder Japanischen üblich sind, hervorragend indexieren.
Indexierung
Nach der Analyse erfolgen die eigentliche Indexierung und das Abspeichern des aufbereiteten Suchraums. Lucene unterscheidet die Indexfelder „indexed“, „tokenized“ und „stored“. Diese Attribute, die sich auch kombinieren lassen, geben an, ob ein Feld durchsuchbar (indexed) sein soll, ob der Eingabestream durch einen Analyzer normalisiert (tokenized) wird und schlussendlich, ob das Feld in seiner Originalform im Index abgespeichert (stored) werden soll.
Suchtypen
Lucene kennt Term- und Phrasensuche, Boolesche Operatoren, Wildcard-Suche, Range-Queries (Bereichsanfragen) sowie Fuzzy- und Proximity-Suche. Auch auf dieser Ebene stützt sich Lucene auf ein mehrschichtiges Modell. Bevor der eigentliche Suchvorgang stattfindet, muss die Anfrage erst in ein abstraktes Anfrageobjekt überführt werden. Diese Aufgabe lässt sich entweder über ein Such-API erledigen oder alternativ über einen Query-Parser. Der zweite Ansatz erlaubt es, eine eigene Anfragesyntax zu implementieren.
Der integrierte Query Parser lehnt sich mit seiner Syntax stark an Googles Anfragesprache an. Das erzeugte Anfrageobjekt wird anschließend an einen Index-Searcher übergeben, der die Suche im technischen Sinne betreibt. Zur Präsentation der Ergebnisse, beispielsweise auf einer Web-Seite oder in einer Desktop-Applikation, kann man über eine Klasse namens Hits auf die Treffer zugreifen. Aus Performance-Gründen holt eine Hits-Instanz nicht alle Treffer aus dem Index, sondern nur eine begrenzte Anzahl der besten Ergebnisse. Über Low-Level-Methoden können eigene Scoring- und Sortier-Algorithmen implementiert werden. Allerdings müssen diese auch beim Indexieren berücksichtigt werden.
Portierungen
Nennenswerte Lucene-Adaptionen existieren für Perl (Plucene), Python (PyLucene), Ruby (Ferret) und C++ (CLucene). Allerdings sind manche dieser Implementierungen zum Teil inkompatibel zur originalen Java-Version, insbesondere was den Index anbelangt.
Literatur
Manfred Hardt, Fabian Theis: Suchmaschinen entwickeln mit Apache Lucene. Software & Support Verlag, 2004.
Das Buch bietet einen Schnelleinstieg in das Lucene-Framework und richtet sich vor allem an Entwickler, die die größtenteils englischsprachige Dokumentation scheuen.
Otis Gospodnetic, Erik Hatcher: Lucene In Action. Manning Publications, 2004.
Die beiden Autoren, die zum Entwicklerteam von Lucene gehören, vermitteln profunde Kenntnisse über Lucene-Interna und Best-Practice-Vorgehensweisen für typische Lucene-Probleme. Mehrere Fallstudien, eine Bewertung der wichtigsten Lucene-Portierungen sowie ein Überblick über diverse Lucene-relevante Entwickler-Tools runden dieses Fachbuch ab.