Apache Lucene sucht weiter, Teil 2

Maßgeschneiderte Suche

Bernd Fondermann

Niemand weiß besser über Ihre Daten bescheid, als Sie selbst. Beste Voraussetzungen, um eine Suche zu bauen, die nicht nur Power-Usern Vorteile bringt, sondern auch Ihre Produkte ins beste Licht rückt.

Im einführenden ersten Teil dieser Serie haben wir eine minimale Suchfunktion mit Apache Lucene implementiert. Sie funktioniert und führt angesichts des geringen Aufwands schon zu sehr guten Resultaten. Lucene ist in der Lage, Suchergebnisse zu ‚ranken‘: Es wird bessere Treffer weiter oben plazieren. ‚Besser‘ bedeutet beispielsweise, dass das Suchwort öfter oder weiter vorne als in anderen Dokumenten vorkommt.

Doch wie schließe ich aus, dass ein 10 Jahre altes Dokument vor dem letzte Woche neu eingestellten gefunden wird, nur weil das entscheidende Stichwort darin acht statt sieben Mal auftaucht? Und wie verlinke ich von der Ergebnisliste auf das Original, schließlich speichert Lucene Texte nicht als Ganzes, sondern indiziert?

Es scheint notwendig, unseren Lucene-Dokumenten mehr Wissen über die eingehenden Daten mitzugeben, als ’nur‘ den rohen Text.

Dokumente und Felder

Dafür stellt ein Document-Objekt die Möglichkeit bereit, beliebig viele Felder zu belegen. Für jedes Feld trifft man die Entscheidung, ob es durchsuchbar sein soll (INDEXED) oder mit dem Suchergebnis zurückgeliefert wird (STORED), oder beides. Felder sind vergleichbar mit den Spalten einer Datenbanktabelle. Jedes Feld hat einen eindeutigen Namen, der bei der Formulierung der Suche verwendet werden kann. Ein Beispiel: Speichern wir in einem Feld headline die Überschrift eines Textes und in einem anderen Feld fulltext den Rest, können wir unsere Suche beschränken: headline:britney sucht nur in allen Überschriften, fulltext:britney nur im Volltext. headline:britney OR fulltext:britney liefert Treffer zurück, wo unser Term in einem von beiden Feldern vorkommt.

Felder mit dem angehängten STORED-Attribut sind ein mächtiges Werkzeug, um ein Suchergebnis anzuzeigen oder wieder mit den Ursprungsdaten zu verknüpfen. Erinnern wir uns: Lucene speichert die indizierten Texte nicht in der ursprünglichen Form, sondern nimmt sie auseinander. Für STORED-Felder gilt das auch, allerdings wird die Ausgangsform ebenfalls abgelegt. Dies bläht den vom Index benötigten Speicher auf, doch für kurze Informationen, wie eine Überschrift, einen Produktnamen oder ähnliche Informationen, die man im Suchergebnis anzeigen möchte, ist es zumindest eine Überlegung wert, auf diesen Nachteil einzugehen.

Manche Felder möchte man zumeist gar nicht indizieren, z. B. den Primary Key, unter dem man die zum Document gehörenden Ursprungsinformationen wiederfindet. Solche Felder werden nach bewährter Praxis als STORED abgelegt.

Warum sollte man aber den Schlüssel eines Dokuments überhaupt mit im Index ablegen? Es stimmt, der Schlüssel ist für die Suche nicht relevant. Doch kommt nach der Suche die Anzeige des Ergebnisses. Von dort möchte der suchende Nutzer in der Regel an die eigentliche Fundstelle springen. Und um den Verweis auf diese Stelle (das Ursprungsdokument) zu generieren, ist man darauf angewiesen, dass alle dafür benötigten Informationen im Lucene-Document enthalten sind. Und mit dem Suchergebnis kommen nur die STORED-Felder zurück.

Hier einige Anwendungsfälle für Feldattribute:

Feld Attribute Anwendung
Eindeutige ID des Dokuments (URL, Primärschlüssel, Artikel-ID) STORED, selten: INDEXED Zur Referenzierung eines Treffers aus der Ergebnisliste in die Vollansicht
Datum STORED Nur aktuelle Informationen durchsuchen oder zeitliche Einschränkung der Ergebnisse
Titel, Überschrift, Zusammenfassung, Schlagworte INDEXED, manchmal: STORED Treffer in diesen Feldern führen zu einem besseren Ranking
Ausschlusskennungen STORED Markieren Dokumente, die nur zeitlich oder auf bestimmte privilegierte Usergruppen begrenzt gefunden werden sollen

Tabelle 1: Anwendungsfälle für Feldattribute

Mein Haus, mein Boot, mein Index

Wie genau welche Felder indiziert werden, dafür gibt es bei komplexeren Datenmodellen keine Goldene Regel. Ähnlich wie beim Erstellen eines Datenbankschemas hängt dies sehr von der zugrunde liegenden Aufgabenstellungen ab. Apache Lucene ist ein Framework, die Modellierung der einfließenden Documents ist dann Teil der Umsetzung. Listing 1 zeigt einige typische Anwendungsfälle für STORED and INDEXED Attribute auf.

Document doc = new Document();
doc.add(new Field("id", "00001", Field.Store.YES, Field.Index.NO));
doc.add(new Field("isbn", "978-3150000014", 
                  Field.Store.YES, 
                  Field.Index.NOT_ANALYZED));
doc.add(new Field("name", "Faust I: Der Tragödie erster Teil", 
                  Field.Store.COMPRESS, 
                  Field.Index.ANALYZED));
doc.add(new Field("author", "Johann Wolfgang von Goethe", 
                  Field.Store.YES, 
                  Field.Index.ANALYZED));
doc.add(new Field("description", book.getDescription(), 
                  Field.Store.NO, 
                  Field.Index.ANALYZED));
Geschrieben von
Bernd Fondermann
Kommentare

Schreibe einen Kommentar

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