PHP Magazin

PHP, JavaScript, Open Web Technologies
X

Schon abgestimmt? Quickvote: Ist TDD der Weisheit letzter Schluss?

Verschiedene Möglichkeiten, einen Lucene-Suchindex via PHP einzubinden

Lucene – Ein Suchindex in der Praxis

Andreas Bohne-Lang

"Gehen dem Menschen Hühner und Hunde verloren, so weiß er, wo er sie suchen soll. Geht ihm sein Herz verloren, so weiß er nicht, wo er es suchen soll." (Mengzi, chines. Philosoph). Mit einer Suchmaschine findet man weder die Hühner noch das verloren gegangene Herz - dafür aber sehr schnell solche Weisheiten. Der Artikel beschreibt drei Möglichkeiten, um mit PHP einen Suchindex mittels Lucene aufzubauen und abzufragen. Auf Basis des so erzeugten Indexes kann man dann im Folgenden eine eigene Suchmaschine für Dokumente oder Webseiten betreiben. Jede der Möglichkeiten wird mit ihren Licht- und Schattenseiten beschrieben.

Nur allzu oft werden Suchmaschine und Suchindex nicht nur in einem Atemzug genannt, sondern auch fälschlicherweise als Synonyme verwendet. Vorab zur Begriffsklärung: Ein Suchindex ist nichts weiter als eine Sammlung von Verweisen auf anderswo gespeicherte Daten. Meist ist dies eine Datei, in der Informationen über Dokumente oder Webseiten abgelegt sind. Der Vorteil eines Indexes ist, dass man Daten sehr schnell wiederfinden kann und das Geheimnis liegt darin, wie die verschiedenen Algorithmen die Daten dort ablegen. Suchmaschinen hingegen bestehen aus primär drei Teilen: einem Suchindex, in dem die Daten gehalten werden, einer Abfrageschnittstelle, wie z. B. eine Webseite mit PHP, und einer Möglichkeit, dem Suchindex neue Daten zuzuführen, wobei die meisten hier an einen Crawler oder auch Spider denken, der Webseiten abruft und den Inhalt automatisch in dem Index ablegt. Man kann die Daten aber auch mittels eigener Routinen in den Suchindex einfügen (Programmbeispiele).

Hinweis

Auf der CD zu diesem Heft finden sich neben den kompletten Beispielprogrammen auch einige Installationsskripte, die auf einem Unix-basierten System eine PHP-Umgebung übersetzen und sie mit entsprechender Suchmaschine ablauffertig ins Home-Verzeichnis installieren.

Lucenes Anfänge

Doug Cutting ist der Erfinder des in Java entwickelten Open-Source-Projektes Lucene. Die ersten Schritte machte Lucene 1997, und ein erster Prototyp war im folgenden Jahr verfügbar. Seit 2001 ist Lucene bei der Apache Software Foundation angesiedelt und bildet dort eine der Top-Applikationen. Beruflich hat Cutting bei Apples Suchhilfe "Sherlock" und bei dem Suchmaschinenbetreiber eXite mitgewirkt, und am 13. März 2006 verkündete er in seinem Blog: I’m now a ‚Yahoo!

Noch echte Handarbeit

Lucene ist genau genommen ein Suchindexframework, und das bedeutet im Klartext nichts anderes, als dass es in den Händen des Entwicklers liegt, woher er seine Daten für den Index bekommt und was nach einer Suchanfrage damit passieren soll. Lucene stellt nur die Programmschnittstelle und die dahinterliegende Technologie zur Verfügung. Wer den Inhalt von Dateien in einem Lucene-Index abspeichern möchte, muss sich daher selber darum kümmern, wie er diesen Inhalt aus den Quellen, z. B. PDF-Dokumente oder HTML-Seiten, bekommt. Genau an dieser Stelle kommen dann diverse Konverter, Hilfsprogramme oder andere Programmbibliotheken ins Spiel (Tabelle 1): Möglichkeiten zur Erschließung von Dateiinhalten. Mithilfe von ein paar zusätzlichen Zeilen Code ist das aber kein Problem und ist schnell realisiert.

PDF

PdftotextpdfboxiTextPDF2HTML

MS-Word

Antiword oder Zend-Frameworkbereich Lucene

RFT

Unrtf

OpenOffice

OooPy

Txt

direkt

HTML

Html2txt oder einfach lynx –d

Tabelle 1: Möglichkeiten zur Erschließung von Dateiinhalten

Input – output – putput?

Nach wie vor gibt es einige Benutzer von Suchmaschinen, die meinen, dass ein Suchindex Daten nur unstrukturiert speichern kann. Dieses Vorurteil basiert oft auf einer eingeschränkten Sicht der Ausgabe von Suchmaschinen und an einem Mangel an Erfahrung. Ein Suchindex speichert sehr wohl strukturierte Daten, und in den Beispielen werden wir uns das auch zu Nutze machen. Zur Hierarchie sei gesagt, dass ein Lucene-Suchindex viele Dokumente speichern kann, die aus vielen Feldern bestehen und die wiederum aus vielen Wörtern zusammengesetzt sein können (Abb. 1). Bei den Feldern (Java-Originalbezeichung Field.Index,) kann der Benutzer aus einer Hand voll Möglichkeiten aussuchen, wie er die Daten im Index ablegen möchte, z. B. nicht durchsuchbar oder analysiert und durchsuchbar. Nun fragt man sich, was dieses "analysiert" bedeutet – man kann es mit einer Art Aufbereitung der Daten beschreiben. So gibt es Listen mit Stoppwörtern, die für gewöhnlich nicht in einem Index abgelegt werden. Aus dem Bibliothekskatalog kennt man dieses von dem Buchtitelanfang, wo "der", "die", "das" nicht als Wörter am Titelanfang für den Katalog verwendet werden.

Abb. 1: Struktureller Aufbau eines Suchindex

Falls man die Funktion zum Löschen eines Eintrags sucht, sollte man im Hinterkopf haben, dass man eigentlich nicht aus einem Suchindex löscht. Intern werden gelöschte Einträge in einer separaten Datei gehalten. Bei größeren Löschaktionen sollte man den Index neu aufbauen.

 
Verwandte Themen: 

Kommentare

Ihr Kommentar zum Thema

Als Gast kommentieren:

Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).

Übersicht zu diesem Beitrag