Viele von euch haben bestimmt schon von Suchmaschinen wie Solr oder elasticsearch gehört. Diese Suchtechnologien ermöglichen die Umsetzung von mächtigen und Featurereichen Suchen á la Google. Klingt soweit erst mal ganz spannend. Allerdings gibt es vor und während der Konfiguration der Suchmaschinen ein paar Dinge zu beachten.
Um was es sich dabei handeln kann, möchte ich euch am folgenden Beispiel zeigen. Hier soll Solr für eine Volltextsuche in der deutschen Sprache genutzt werden. Voraussetzung ist allerdings Grundkenntnisse in Bezug auf Solr zu besitzen.
Deutsches Textfeld
Das Eingabefeld einer Suche wird in der schema.xml grundlegend für die deutsche Sprache konfiguriert. Dabei werden Parameter bzw. Filter für eine Analyse der deutschen Texte definiert. Nachfolgend seht ihr, wie die Konfiguration für ein Textfeld in der schema.xml aussieht, welches Texte umfangreich hinsichtlich der deutschen Sprache analysiert. Besonders interessant sind dabei SynonymFilterFactory, DictionaryCompoundWordTokenFilterFactory, StopFilterFactory, GermanNormalizationFilterFactory, SnowballPorterFilterFactory. Diese werde ich später noch näher erklären.
<fieldType name="full_text_german" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.WordDelimiterFilterFactory" generatewordparts="1" generatenumberparts="1" catenatewords="1" catenatenumbers="1" catenateall="0" splitoncasechange="1" preserveoriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonymsGerman.txt" ignorecase="true" expand="true"/> <filter class="solr.DictionaryCompoundWordTokenFilterFactory" dictionary="dictionaryGerman.txt" minwordsize="5" minsubwordsize="3" maxsubwordsize="30" onlylongestmatch="false"/> <filter class="solr.StopFilterFactory" words="stopwordsGerman.txt" ignorecase="true" enablepositionincrements="true"/> <filter class="solr.GermanNormalizationFilterFactory"/> <filter class="solr.SnowballPorterFilterFactory" language="German2" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.WordDelimiterFilterFactory" generatewordparts="1" generatenumberparts="1" catenatewords="0" catenatenumbers="0" catenateall="0" splitoncasechange="1" preserveoriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.StopFilterFactory" words="stopwordsGerman.txt" ignorecase="true" enablepositionincrements="true"/> <filter class="solr.GermanNormalizationFilterFactory"/> <filter class="solr.SnowballPorterFilterFactory" language="German2" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> </fieldType>
SynonymFilterFactory
Wie der Name vermuten lässt, indiziert dieser Filter Synonyme für ein gegebenes Wort. Besonders wichtig dabei ist die Datei, welche die Synonyme enthält. Jede Zeile sollte dabei eine Synonymkette enthalten, z.B. „Fortführung, Wiederaufnahme“. Das führt dazu, dass eine Suche nach Fortführung auch Texte findet, die Wiederaufnahme enthalten.
Eine Datei mit Synonymen kann z.B. bei OpenThesaurus gefunden werden, muss dann aber noch in das passende Format für Solr überführt werden. Oder auch in unserer TYPO3 Extension MKSEARCH, wo die Synonymliste fertig für Solr aufbereitet ist.
DictionaryCompoundWordTokenFilterFactory
Dieser Filter hilft dabei, zusammengesetzte Wörter in ihre Teilwörter zu trennen. So können aus Donau-Dampfschifffahrt die Teilwörter Donau, Dampf, Schiff und Fahrt extrahiert werden. Voraussetzung hierfür: Die Wörter sind im Wörterbuch enthalten. In den Suchergebnissen werden so auch Texte aufgeführt, die Donau-Dampfschifffahrt enthalten, auch wenn nur nach einem Teil des Wortes, z.B. „Schiff“, gesucht wurde. Um unscharfe Suchergebnisse zu vermeiden, sollte dieser Filter aber nur zur Indizierungszeit angewendet werden. Um es an unserem Beispiel zu erklären, vermeiden wir so eine Auflistung von Treffern zur Fahrt, wenn nach Donau-Dampfschifffahrt gesucht wird.
Damit das alles gut funktioniert, muss das benutzte Wörterbuch möglichst umfangreich sein. In MKSEARCH kann ebenfalls eine gute Datei dafür gefunden werden. Alternativ kann man sich im Netz auch selbst ein passendes Wörterbuch suchen und dieses für Solr aufbereiten.
StopFilterFactory
Es gibt viele Wörter, die bei einer Suche keine Beachtung finden sollten. Das liegt daran, dass jedes Suchergebnis von Solr mit einer Relevanz belegt wird. Diese resultiert u.a. auch daraus, wie oft ein Wort im indizierten Text vorkommt. Sucht also ein Nutzer nach „A und B“, wird per Default eine Oder-verknüpfte Suche durchgeführt. Es wird also nach „A“, „und“ und „B“ gesucht. Vermutlich werden viele Suchergebnisse das Wort „und“ enthalten, aber die für den Nutzer eigentlich relevanteren Inhalte „A“ und „B“ tauchen gar nicht oder nur selten in der Ergebnisliste auf. Um diese überwiegend unbrauchbaren Suchergebnisse gar nicht erst eintreten zu lassen, verwenden wir oben im Beispiel einen StopFilter. Dieser bezieht sich auf eine Datei, die eine erweiterbare Liste von Wörtern enthält, die von der Suche ausgeklammert werden sollen. Somit kann die Qualität der Suchergebnisse durch die Qualität Liste an Stoppwörtern beeinflusst werden. Auch hier bieten wir in MKSEARCH eine umfangreiche Liste an.
GermanNormalizationFilterFactory und SnowballPorterFilterFactory
Diese beiden Filter berücksichtigen Besonderheiten der deutschen Sprache. Richtig eingesetzt, transformieren sie Umlaute (z.B. ä wird zu ae) oder können Wortstämme korrekt herleiten. Mit dieser Smart-Technologie können bspw. bei der Suche nach dem Wort „Früchte“ auch Ergebnisse gefunden werden, wenn der Text „Frucht“ enthält.
Highlighting
Wenn man die Highlighting Komponente verwendet, muss ein Feldtyp dafür konfiguriert werden. Hier kann man im Prinzip den gleichen Feldtypen wie für eine Volltextsuche verwenden. Lediglich der Synonymfilter sollte weggelassen werden. Sonst bekommt „Fortführung“ ein Highlight auch wenn nach „Wiederaufnahme“ gesucht wird. Das könnte Nutzer durchaus verwirren.
Fazit
Wie zu sehen ist, war es gar nicht so schwer, Solr deutsch beizubringen. Wer ein großes deutsches Wörterbuch, eine Stoppwortliste und eine umfangreiche Synonymliste benötigt, kann diese in unserer TYPO3 Extension MKSEARCH finden. Einfach die Extension unter typo3.org herunterladen und in TYPO3 installieren. Die Dateien finden sich dann unter solr/conf/. In der Extension lässt sich auch ein Query Converter für die Unterstützung eines Autocompletes mit ganzen Phrasen finden. Was es damit auf sich hat, werde ich in nächster Zeit hier erklären.
Viel Spaß damit.