Indexierung von zusammengesetzten Wörtern in Apache Solr

13.05.2016 um 08:49 Uhr – gepostet von René Nitzsche in Web Development

Die Indexierung von Texten in Apache Solr ist ein mehrstufiger Prozess, bei dem nacheinander verschiedene Komponenten, in Solr sprechen wir von Filtern, den Textinhalt in suchbare Terme zerlegen. Jeder dieser Filter ist genau für einen Teilschritt verantwortlich. So gibt es zum Beispiel einen Filter der HTML-Tags entfernt, einen weiteren der Begriffe auf ihren Wortstamm reduziert und einen der Synonyme für die gefundenen Begriffe bereitstellt.

Eine dieser Komponenten ist auch für die Aufteilung von zusammengesetzten Wörtern verantwortlich. Die Aufgabe klingt trivial, ist aber in der Praxis mit Solr, speziell für die deutsche Sprache, nicht einfach zu lösen.

Der existierende Ansatz ist in der solr.DictionaryCompoundWordTokenFilterFactory umgesetzt. Dieser Filter versucht aus zusammengesetzten Wörtern die einzelnen Teilwörter zu ermitteln. Bei dem Wort Baumfällantragfindet der Algorithmus mit der Default-Konfiguration die Begriffe baumfällantragbaubaum, fall, alllan und antrag.

Ausschnitt auf der schema.xml mit der DictionaryCompoundWordTokenFilterFactory

Wenn wir nun nach bau suchen, dann werden wir den Baumfällantrag also mit in der Trefferliste finden. Ein Treffer, den wir eher nicht finden wollen. Wenn man sich die Optionen im Filter anschaut, ist die Auswahl recht übersichtlich. Mit onlyLongestMatch können wir den Treffer aber verhindern. Man setzt die Option auf TRUE und erreicht damit, dass immer nur das längste gefundene Teilwort verwendet wird. Bei bau und baum wird also nur noch baum verwendet. Die Wortliste lautet nun baum, fallalllan und antrag.

 

Im Solr-Admin kann man mit dem Analyser die Indexierungsschritte sehr gut nachvollziehen.

Warum ist die Suche nun trotzdem nicht optimal? Wir haben durch die Umstellung jetzt eine schärfere Suche mit weniger Treffern. Das kann bei bestimmten Konstellationen dazu führen, dass wir Begriffe zu Unrecht ausschließen. Ein Gegenbeispiel ist der Begriff Baumaschine. Der wird nun in baummaschineschichi und hin aufgeteilt. Damit kann er über den Suchbegriff bau nicht mehr gefunden werden.

Aus meiner Sicht bietet die vorhandene Implementierung der Worttrennung großes Verbesserungspotenzial. Das Wort Baumfällantrag lässt sich ohne Rest in baumfall und antrag trennen. Das wäre die optimale Lösung. Eine Suche nach weiteren Unterbegriffen nicht sinnvoll, wird aber trotzdem gemacht. Auch die Baumaschine kann nach dieser Regel in bau und maschine aufgetrennt werden. Der Algorithmus müsste entsprechend erweitert werden.

Da die Zusammensetzung von Wörtern in der englischen Sprache nicht so oft vor kommt und dann oftmals auch nicht so komplex wie im Deutschen ist, existiert für diese Aufgabe auf nur diese einfache Umsetzung. Da die Engländer mit der vorhandenen Lösung leben können, bleibt es also an den deutschen Entwicklern hängen, eine passende Lösung zu finden. Wir haben also ein komplexes Problem (deutsche Sprache, schwierige Sprache) und eine relativ kleine Entwicklerbasis...

< Czech me out, Magento!

Hinterlasse einen Kommentar