Mittwoch, 23. Mai 2012


Artikel

Oktober 2009 | Artikel

Apache Lucene 2.9 Fortsetzung, Teil 2

Teil 1   Teil 2   

Flexibler
Einen genauen Blick sollte man auf eigene TokenStream-Implementierungen werfen. TokenStreams verwandeln den eingehenden Text in die Häppchen, die dem Index gefüttert werden. Hier wurde das API komplett geändert – weiteres Finetuning ist schon angekündigt. Eine neue Oberklasse AttributeSource erlaubt nun wesentlich komplexere und flexibel zusammengesteckte Operationen. Hier wartet unter Umständen einiges an Arbeit auf den Lucene-Nutzer.

Ein Index kann aus mehreren Segmenten bestehen. Bisher konnte Apache Lucene diese nur als Gesamtheit durchsuchen, was zur Invalidierung aller Such-Caches führte, sobald sich nur ein Segment geändert hatte. In 2.9 werden die Segmente separat behandelt.

Eine weitere wesentliche Änderung ist, dass nun keine Score-Werte mehr mit dem Ergebnis zurückgeliefert werden. Diese Werte sind für den Endverbraucher in der Regel nicht aussagekräftig. Sollen sie trotzdem dargestellt oder programmatisch ausgewertet werden, muss man die Berechnung der Score-Werte explizit aktivieren.

Optimiert
Bisher konnte man nur Dokumente suchen, die mit IndexWriter.commit() endgültig geschrieben worden waren. Zusätzlich musste IndexReader.reopen() aufgerufen werden. IndexWriter.getReader() ermöglicht nun eine Suche auf allen dem IndexWriter bekannt gemachten Dokumenten.

Eine Zahl sagt mehr als tausend Worte
Bisher galt: Lucene ist eine textbasierte Suchmaschine. Um Zahlen durchsuchbar zu machen, mussten sie in Text umgewandelt werden und als Strings indiziert werden. Dies führte zu Problemen, wenn zu viele verschiedene Zahlenwerte für ein Intervall im Index waren. Da jeder einzelne Wert zu einem großen Query "verODERt" wurde, konnte dies leicht zu tausenden von Termen führen, und Lucene strich die Segel. Dies war der Fall bei Datumswerten, die inklusive Millisekunden indiziert wurden, wobei die Suche dann über mehrere Monate erfolgen sollte. Auch bei Messwerten wie zum Beispiel Längen- und Breitengraden, bei denen selbst für einen annähernd gleichen Ort verschiedene Nachkommastellen herauskommen, gab es Probleme.

Der deutsche Lucene-Committer Uwe Schindler nahm sich des Problems an und ergänzte Lucene um die Fähigkeit, auch Zahlen effizient durchsuchbar zu machen. Er führte den Feldtyp NumericField ein. In solchermaßen indizierten Zahlenfeldern wie z.B. der Datumsrange 30.3.2009 bis 5.4.2009 wird nun nach allen Dokumenten gesucht, die entweder dem Wert "30.3.2009" oder dem Wert "März 2009" oder den Tagen 1.4 bis 5.4. zugeordnet sind. In der Mitte des Intervalls wird also die Suche vergröbert, nach außen hin nach Bedarf verfeinert. Dies ist extrem effizient [4]. Außerdem können NumericFields dazu dienen, die Sortierung der Suchergebnisse zu beschleunigen.

Fazit
Lucene 2.9 ist für sich genommen ein nennenswertes Release. Wer von den vielen kleinen Verbesserungen profitieren will, sollte die Migration in Angriff nehmen. Mit Lucene 3.0 stehen aber auf jeden Fall weitere einschneidende Änderungen an: Java 5 wird dann vorausgesetzt, Java 1.4 nicht mehr unterstützt. Unter Umständen kann sich das Überspringen von 3.0 also für denjenigen lohnen, der gerne alles in einem Schritt erledigt und abwarten kann, bis sich neue Features "gesetzt" haben. Für einen graduellen Übergang ist 2.9 aber ideal.

Nicht unerwähnt bleiben soll, dass das nächste Apache Solr Release basierend auf Lucene 2.9 ebenfalls in Kürze erscheinen soll.

Bernd Fondermann ist freiberuflicher Software-Architekt und Consultant in Frankfurt a M. Er beschäftigt sich mit innovativen Open-Source-Technologien bei der Apache Software Foundation und ist derzeit PMC Chair und Vice President Apache Labs. Kontakt: bernd.fondermann[at]brainlounge.de
  1. http://lucene.apache.org/
  2. Lucene Change Log
  3. Lucene 2.9.0 API
  4. Schindler, U, Diepenbroek, M, 2008. Generic XML-based Framework for Metadata Portals. Computers & Geosciences 34 (12), 1947-1955.

Teil 1   Teil 2   

Kommentare

Gravatar Martin Wildam 15.10.2009
um 21:21 Uhr
Ich habe mir zwar bis jetzt nur einen groben Überblick verschafft was Lucene ist aber irgendwie kann ich mich nicht ganz anfreunden damit: Die Reihenfolge der Suchergebnisse scheinen nicht besonders beinflussbar und natürlich gibt es nicht viel Struktur - ich vermisse die Möglichkeiten die ich in einer relationalen Datenbank habe. Im Grunde würde ich beides ja gerne kombinieren aber geht das überhaupt?Ist es überhaupt aus aktueller Sicht noch so daß Lucene viel mehr Performance bringt als die Voll-Text-Features anderer Datenbanken zB MySQL? #zitieren
Gravatar Bernd Fondermann 16.10.2009
um 12:43 Uhr
Die Antwort darauf würde einen eigenen Artikel oder sogar ein ganzes Buch füllen; an dieser Stelle muß ich mich leider auf Stichworte beschränken.Ja aus der relationalen in die Dokumenten-orientierte Welt zu wechseln bedeutet auch einen Paradigmenwechsel zu vollziehen der den meisten nach einiger Zeit aber keine Probleme mehr bereitet. Lucene-Lösungen wie Apache Solr können diesen Übergang erleichtern weil sie eine Schema-orientierte Sicht auf Dokumente haben ähnlich wie in SQL-DBs.In der Tat stehen in vielen Produktivsystemen DB und Lucene nebeneinander. Tipp bezüglich Integration: "Hibernate Search".Lucene ist in seinem Verhalten hochgradig steuerbar. Die Relevanz läßt sich durch "Boost"-Faktoren feingranular einstellen auf Dokumenten- Feld- oder Query-Term-Ebene.Die Sortierung der Ergebnisse ist keineswegs beliebig die Relevanz läßt sich steuern. Sortierung nach Datum oder alphanumerisch ist möglich. #zitieren
Gravatar Martin Wildam 16.10.2009
um 12:59 Uhr
Vielen Dank für Ihre Antwort. Wie sieht es mit Performance-Vergleichen von zB MySQL-Lucene wirklich aus? - Ich habe von einigen gelesen dass die Performance von Lucene essentiell besser sein soll als bei MySQL. Ist das wirklich so? #zitieren
Gravatar Martin Wildam 16.10.2009
um 13:11 Uhr
Ich habe noch eine interessante Diskussion gefunden: http://www.webmasterworld.com/forum23/3557.htmDarin heißt es zwar zum Schluss dass Lucene besser geeignet sein könnte aber es geht auch daraus hervor dass man aufpassen muss wie man die Indexe anlegt damit das Ergebnis entsprechend schnell da ist.Hier eine Diskussion die MySQL ganz schlecht aussehen lässt:http://www.mysqlperformanceblog.com/2006/09/22/eurooscon-2006-high-performance-fulltext-search/#comment-2723Allerdings: Alles was ich zu dem Thema finde ist meistens schon älter - also eigentlich keine Aussagen auf Basis aktueller Software-Stände - so dass es fast aussieht als müsste ich meine eigenen Vergleichstests starten... #zitieren
Gravatar Bernd Fondermann 16.10.2009
um 14:08 Uhr
###zitat:anfang###Martin Wildam:Vielen Dank für Ihre Antwort. Wie sieht es mit Performance-Vergleichen von zB MySQL-Lucene wirklich aus? - Ich habe von einigen gelesen dass die Performance von Lucene essentiell besser sein soll als bei MySQL. Ist das wirklich so?###zitat:ende###Ich benutze kein mySQL deswegen kann ich dazu nichts sagen.Da Apache Lucene eine für die Volltext-Suche optimierte Architektur zugrunde liegt würde es mich nicht sehr wundern wenn es sich gegenüber mySQL nicht verstecken müßte. Mal ganz abgesehen von den speziellen Features die Lucene über einen einfachen invertierten Index hinaus bietet. #zitieren
Gravatar Kratzig 29.10.2010
um 09:53 Uhr
Hallo Bernd Fondermann,
Sie schreiben, dass "Lucene ist in seinem Verhalten hochgradig steuerbar ist. Die Relevanz läßt sich durch "Boost"-Faktoren feingranular einstellen auf Dokumenten- Feld- oder Query-Term-Ebene." Mich würde nun einmal interessieren, wie das funktionieren würde. Kennen Sie zufällig eine Dokumentation darüber? Für eine Antwort wäre ich sehr dankbar.
#zitieren
Gravatar Bernd Fondermann 29.10.2010
um 17:18 Uhr
Boosting kann man während der Indizierung oder der Abfrage einsetzen.
siehe
http://lucene.apache.org/java/3_0_2/api/all/org/apache/lucene/document/Document.html
http://lucene.apache.org/java/2_4_0/queryparsersyntax.html

Ich hab's in der Schnelle nicht recherchiert, aber sicher ist die einschlägige Literatur wie "Lucene in Action" da etwas ausführlicher.
#zitieren