Artikel

 
Oktober 2009 | Artikel

Apache Lucene 2.9

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2594)

Auf neuen Wegen

Text: Bernd Fondermann
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Das beliebte Suchmaschinen-Framework Apache Lucene [1] ist Ende September in Version 2.9 veröffentlicht worden. Neben vielen Erweiterungen und Verbesserungen sind einige alte API-Wege nun als Sackgassen ausgewiesen. Die Version 3.0 ist nur einen kleinen Schritt entfernt. Der Gang auf dem Upgrade-Pfad sollte nicht allzu steil sein, wenn man bei der neuesten Ausgabe eine Zwischenrast einlegt. Ein Reiseführer.
Teil 1   Teil 2   

Lucene 2.9 erklärt einige altbekannte Klassen und Methoden des Frameworks als "deprecated" und stellt die nun bevorzugten neuen Werkzeuge daneben (siehe Lucene Change Log [2]). In dem geplanten Release 3.0 werden dann einige Funktionen nur noch in neuer Form zur Verfügung stehen. Das aktuelle Release präsentiert ein API im Übergang [3]. An mehreren Stellen treten abstrakte Oberklassen auf den Plan, wo vorher Interfaces oder nicht-abstrakte Implementierungen vorlagen.

Empfohlene Route
Ausdrücklich wird empfohlen, nicht einfach die alten JARs gegen die der 2.9 Version auszutauschen, sondern auf jeden Fall das eigene Projekt zu re-kompilieren und neu gegen Lucene 2.9 zu "linken". Es steht zu erwarten, dass nicht wenige "deprecated"-Warnungen erscheinen, wie ein kurzer Praxistest zeigt. Nutzt man Subclassing von Lucene-Klassen oder implementiert selber Lucene Interfaces kann man so herausfinden, wo sich die Lucene-Klassenhierarchie inkompatibel geändert hat.

Dies wird ein gutes Gefühl dafür geben, welche Arbeit mit Erscheinen von Version 3.0 unerlässlich werden wird, will man die enthaltenen Verbesserungen nutzen.

Deprecated
Ein IndexReader wird über die statische open()-Factory-Methode erzeugt, von denen es in 2.4 ganze neun verschiedene gab. Fünf davon sind nun deprecated. In 2.9 sind es jetzt insgesamt 14 überladene open-Varianten, wobei aber acht davon deprecated sind. Das bedeutet, es sind sogar welche hinzugekommen, die unmittelbar mit Einführung als deprecated gekennzeichnet worden sind - verwirrend.

Die Konstruktor-Deprecation-Orgie geht beim StandardAnalyzer, einer der zentralen Klassen beim Indizieren und Abfragen, weiter. Diese Klasse hat nun keinen Argumenten-losen Konstruktor mehr, was vielleicht einige Downstream-Libraries zum Stolpern bringen könnte, die ihren Analyzer über eine Property, welche den Klassennamen enthält, dynamisch instanziieren. Stattdessen muss ein Version-Objekt mitgegeben werden, um sich für Kompatibilität zu 2.4 oder 2.9 festzulegen. Sowohl der VERSION_24- als auch der VERSION_29-Parameter sind aber ihrerseits deprecated - sehr verwirrend! VERSION_CURRENT ist damit die einzige sichere Investition in die Zukunft, ein Wert, dem man durchaus auch als Vorbelegung in einem Zero-Argument-Konstruktor Vertrauen geschenkt hätte.

Zum Schreiben eines Indexes braucht es eine IndexWriter-Instanz. Auch hier sind die meisten der 19 möglichen Konstruktoren kurz davor, aufs Altenteil gelegt zu werden.

Ähnliches gilt für FSDirectory, eine wichtige Klasse, um Lucene zu sagen, wo es den Index finden kann. Außerdem wird FSDirectory mit Lucene 3.0 eine abstrakte Klasse werden, die konkrete Implementierung ist neuerdings SimpleFSDirectory (neben den sonstigen Varianten, die es weiterhin gibt).

Teil 1   Teil 2   

Anzeige

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

Anzeige

zurück zum Seitenanfang