Suche
Search Bites

Apache Lucene und Solr 6.4 veröffentlicht: Graphen bei Textanalyse und besseres Query-Parsing

Uwe Schindler

Das Apache Lucene Team hat heute Apache Lucene und Apache Solr in der Version 6.4 veröffentlicht. Uwe Schindler erklärt in seiner Kolumne Search Bites die wichtigsten Neuerungen.

Apache Lucene und Solr 6.4 sind da

Apache Lucene, die unter Apache Solr und Elasticsearch liegende Bibliothek für Volltextsuchen, hat wieder einige Neuigkeiten zu verzeichnen: Es wurde vor allem an der Textanalyse gearbeitet, so dass das API nun besser TokenStreams unterstützt, welche Tokens produzieren, die eine graphartige Struktur haben. Dies tritt vor allem dann auf, wenn an der Position eines einzelnen Tokens eine Sequenz von mehreren Tokens als Alternative erzeugt wird.

Klassisches Beispiel sind Synonyme mit mehreren Worten: So kann ein TokenFilter für den Term “USA” als Alternative “Vereinigte Staaten von Amerika” einfügen. Dadurch wird ermöglicht, dass Texte, die nur “USA” enthalten, auch auf eine Suche nach dem ausgeschriebenen Namen gefunden werden, oder eben umgekehrt. Ein etwas komplexeres Beispiel könnte so aussehen:

solr

Synonym-Graph, erstellt von Lucene-Committer Mike McCandless (Quelle).

Das Problem ist der bei der Lucene-Textanalyse verwendete Ansatz: TokenStreams geben alle Terme eines Strings als eine Art Iterator zurück, wobei mehrere Attribute an jeden Term angehängt werden. Um solche Graphen zu erzeugen, konnte man früher nur das “Position-Increment” Attribut benutzen. Dieses sorgt für die Positionszählung bei den Termen. Normalerweise ist dieses Attribut „1“, weil ein Token erzeugt wurde, der eine neue Position im Text benutzt. Für Synonyme wurde dabei die aktuelle Position einfach nicht weitergezählt und somit „0“ zurückgegeben, wodurch der neue Term an der gleichen Position steht.

Das bringt jedoch Probleme, wenn der Originalterm und das Synonym eine unterschiedliche Wortanzahl haben. Daher wurde bereits in früheren Lucene-Versionen auch ein “Position Length”-Attribut implementiert, was aber bisher noch nicht vernünftig genutzt werden konnte. Für den Term “hotspot” in der obigen Grafik würde der Filter eine Länge von “3” zurückgeben (denn auf alle möglichen Positionen gesehen hätte dieser Term die Länge 3, aber der Position-Increment wäre nur “0”, denn er steht an der gleichen Startposition wie “wi fi” oder “wifi”).

Erst mit Lucene 6.4 ist es möglich, dass auch der Query Parser aus solchen Streams korrekte Abfragen erzeugen kann. Dies betrifft vor allem Phrasen, wo es sehr auf die Positionen ankommt. Hierfür wurde ein neues “GraphQuery” hinzugefügt. Aber es wurde auch für den erwähnten Fall der Synonyme ein neuer Tokenfilter hinzugefügt, welcher Multi-Word-Synonyme mit dem Position-Length Attribut erzeugen kann. Dieser ist natürlich auch mit Apache Solr einsetzbar.

Auch an anderen Stellen wurde kräftig aufgerüstet: Lucene 6.4 ist nun auch kompatibel zu den zuletzt eingeführten Änderungen im Java-9-Jigsaw-Modulsystem. Wie viele andere Projekte hatten auch Lucene und Solr Probleme mit den im Early-Access Build 148 eingeführten Neuerungen zur strikten Encapsulation der Java Runtime. Hier hat auch Lucene wieder einige Änderungsvorschläge an das OpenJDK-Team weitergegeben, und es ist möglich, Lucene ab Java 9 Build 150 problemlos einzusetzen, und das Memory-Mapping der Index-Dateien funktioniert wieder uneingeschränkt.

Schon in Lucene 6.3 wurde der neue “Unified Highlighter” eingefügt. Dieser verbindet die bisher in verschiedenen Klassen verwendeten Highlighting-Algorithmen zu einem universell einsetzbaren Highlighter. Aber erst mit Version 6.4 hat nun auch Apache Solr Unterstützung dafür bekommen. Alle User sind angehalten, diesen in ihren Projekten mit hl.method=unified zu aktivieren. In zukünftigen Versionen wird dieser Highlighter dann auch zum Standard.

Auch sonst baut Apache Solr wie immer auf den Funktionen von Apache Lucene auf, bietet aber selbst einige Neuigkeiten: Es wurde ein Modul hinzugefügt, das den Learning-To-Rank (LTR) Algorithmus umsetzt. Die Implementierung wurde durch Entwickler von Bloomberg zur Verfügung gestellt und ermöglicht es nach der Ausführung der Suchanfrage, noch weiteres Feintuning (Reranking) anzuwenden, um die Ergebnisse anhand erlernter Features noch zu verbessern. Dazu kann man vorher berechnete Modelle als JSON Files dem neuen Modul zur Verfügung stellen.

Zudem wurde Apache Solr ein neues Feature zur besseren Erfassung von JVM-spezifischen Metriken hinzugefügt. Dies macht es einfacher, den Speicherbedarf, Garbage Collection und weitere JVM-Parameter im Metrics-Modul zu überwachen. Auch sind viele Solr-interne Parameter wie die Anzahl an Index Merges oder das durch den Index erzeugte Disk-I/O ebenfalls abrufbar.

Die Liste der Änderungen von Apache Lucene und Apache Solr sind auf der Projekt-Webseite zu finden.

Geschrieben von
Uwe Schindler
Uwe Schindler
Uwe Schindler ist Mitglied des Project Management Committee im Apache-Lucene-Projekt. Er ist mit seiner Consulting-Firma SD DataSolutions GmbH in Bremen ansässig und kümmert sich am Zentrum für Marine Umweltwissenschaften (MARUM) um die Suche nach geowissenschaftlichen Daten in der Umweltdatenbank PANGAEA.Blog: http://blog.thetaphi.deTwitter: @ThetaPh1
Kommentare

Schreibe einen Kommentar

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