Blog_allgemein

Multiword SpellCheck

Daniel Fuckner

Multiword SpellCheck in Apache Solr unter Verwendung des Shingle-Filters

Ein oftmals auftretendes Problem in Solr ist die Verwendung der SpellCheckComponent (Meinten Sie …) bei der Überprüfung mehrerer aufeinanderfolgender Begriffe, beispielsweise hinsichtlich der Begriffskombination „biig bang theory“.
Die meisten Konfigurationen wenden die SpellCheckComponent in Solr auf einzelne Begriffe an. Sofern eine Query mit mehreren Begriffen an Solr geschickt wird, werden die Begriffe separat durch die (zuvor konfigurierte) SpellCheckComponent hinsichtlich ähnlicher Begriffe im Index überprüft. Bei einer Suche nach „biig bang theory“ in einem DVD-Shop wird folglich jeder der Begriffe hinsichtlich ähnlicher Begriffe im Index untersucht. Für den Begriff „biig“ stellt sich dabei heraus, dass der ähnliche Begriff „big“ im Index existiert. Durch sogenannte Collation-Querys wird dann überprüft, welche Trefferhäufigkeiten die Begriffs-Kombinationen aufweisen. Dabei stellt sich heraus, dass „biig bang theory“ zu keinen Treffen führt, „big bang theory“ hingegen zahlreiche Treffer aufweist.

Die Kombination aus einzelnen Spellchecks und Collation-Querys ist in vielen Fällen bewährt, weist allerdings auch Schwächen auf. Collation-Querys sollten nur für eine begrenzte Menge an Begriffskombinationen durchgeführt werden, da die SpellCheckComponent sonst sehr rechenintensiv werden kann. Die Menge an Begriffen, die durch die zunächst erfolgenden einzelnen Spellchecks vorgeschlagen werden, ist daher in der Regel begrenzt. Je weniger Begriffe infolge der einzelnen Spellchecks vorgeschlagen werden, desto größer ist die Gefahr, dass der korrekte Begriff nicht vorgeschlagen wird. Dies ist insbesondere bei kurzen Begriffen problematisch. Sofern ein Nutzer beispielsweise „bag“ statt „bang“ eingibt, scheinen zahlreiche Alternativen passend, z. B. „bad“, „bar“, „bat“, etc. Sofern „bang“ nicht unter diesen Alternativen erscheint, kann die Collation Query im nachfolgenden Schritt auch nicht die richtige Begriffskombination ermitteln.

Dieses Problem kann man durch die Einbindung eines Shingle-Filters bei der Indexierung bzw. bei der Erstellung eines Index-basierten Spellcheck-Dictionarys beheben. Der Shingle-Filter kombiniert zuvor voneinander getrennte Tokens zu Multiword-Tokens. Der Titel „The Big Bang Theory“ wird bei der Indexierung durch einen Tokenizer (z. B. StandardTokenizer) in mehrere Tokens zerteilt. Durch den Lower Case Filter werden die Großbuchstaben durch Kleinbuchstaben ersetzt. Daraus resultieren die Tokens „the“, „big“, „bang“ und „theory“. Mittels eines Shingle-Filters können daraus die Tokens „the“, „big“, „bang“, „theory“, „the big“, „big bang“, „bang theory“, „the big bang“, „big bang theory“ und „the big bang theory“ gebildet und im Spellcheck-Dictionary bzw. im Index abgelegt werden. Bei einer Suche nach „biig bang theory“ kann die SpellCheckComponent nun so konfiguriert werden, dass die ganze Phrase mit Tokens im Index verglichen wird und nicht jeder Begriff einzeln. Da das Token „big bang theory“ nun (höchstwahrscheinlich) das einzige Token ist, dessen Übereinstimmung mit der Zeichenfolge „biig bang theory“ nur eine Korrektur erfordert, wird die SpellCheckComponent dieses Token ermitteln und vorschlagen.

Bei der Konfiguration eines Shingle-Filters für eine SpellCheckComponent ist zu berücksichtigen, dass Query-Parser Querys in der Regel selbst tokenisieren und einzeln in die Analysekette übergeben. Der Abgleich mit Multiword-Tokens im Index kann jedoch nur dann korrekt erfolgen, sofern die Begriffe einer Query selbst durch einen Shingle-Filter bearbeitet werden. Da die Begriffe jedoch einzeln übergeben werden, können keine Multiword-Tokens gebildet werden. Um dieses Problem zu umgehen, ist die Query für den Spellcheck mittels des Parameters spellcheck.q zu übergeben.