Enterprise Search Solr für mehrsprachige Webseites in OpenCms

Vorwort

Für unseren Kunden Sycor GmbH realisierten wir deren internationalen Webauftritt mit OpenCms 8.5.1 in den Sprachen Deutsch und Englisch. Anschließend kam Chinesisch als dritte Sprache dazu.

Neben weiteren Features bringt OpenCms für eine komfortable Suche standardmäßig die auf der Open Source Searchengine Lucene basierende Enterprise Search Solr mit. comundus realisierte eine funktionsreiche und durch AJAX auch reaktionsschnelle Suchmaske. Durch die Kombination von Solr und AJAX werden die Erwartungen von Benutzern an eine Suchmaschine erfüllt, wie sie sie von Google kennen. Schon während der Eingabe des Suchbegriffs werden Suchvorschläge aufgelistet und ähnliche Suchergebnisse unter dem Suchfeld vorgeschlagen. Durch die Möglichkeit Filter zu setzen für Unternehmensbereiche, Inhaltstypen (HTML, PDF, WORD …) oder Sprachen, kann das Suchergebnis immer weiter eingeschränkt werden. Diese Facettensuche oder auch Filternavigation genannt, reduziert die Ergebnisliste auf den relevanten Inhalt.

Die Aufgabe: Einrichtung einer Enterprise Search Solr

Wichtig war, dass in allen drei Sprachen die korrekten Suchergebnisse angezeigt werden. Dazu ist es notwendig, die Konfiguration von Solr anzupassen. In der mitgelieferten schema.xml-Datei im Verzeichnis WEB-INF/solr/conf/ ist eine Konfiguration für Englisch und Deutsch enthalten, die nicht geändert werden muss. Für Chinesisch war noch keine Konfiguration vorhanden. Im folgenden Kapitel wird beschrieben, welche Einstellungen dafür notwendig sind.

Die Umsetzung

Konfiguration für Chinesisch

Folgende Konfigurationsanpassungen wurden an der schema.xml (/WEB-INF/solr/conf/) für die OpenCms Solr Suche vorgenommen:

1. Im XML-Knoten  folgendes hinzufügen:

<analyzer type="index">
   <tokenizer class="solr.StandardTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PositionFilterFactory" />
</analyzer>

Die Aufteilung in „index“ und „query“ erfolgt deswegen, weil das Solr-Wiki empfiehlt, die PositionFilterFactory nur bei der Ausführung einer Query zu nutzen.

Alternative Konfiguration

<analyzer>
   <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
   <filter class="solr.SmartChineseWordTokenFilterFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
   <filter class="solr.PositionFilterFactory" />
</analyzer>

Diese Konfiguration funktionierte bei uns nicht. Die Indizierung der Solr-Indizes in der Administrationsverwaltung startete mit dieser Konfiguration gar nicht.

Ich erwähne es hier, weil es ein Vorschlag aus der OpenCms-Mailingliste war.

2. Im XML-Knoten  folgendes hinzufügen:

<field name="text_zh" type="text_zh" indexed="true" stored="false" multiValued="true"/><!-- Catchall for Chinese text fields -->

<dynamicField name="*_zh"         type="text_zh"      indexed="true"  stored="true"/>

3. Unten bei den Copy Fields dann noch folgendes einfügen:

<copyField source="*_zh"      dest="text_zh"/>

Bei allen drei Codezeilen habe ich jeweils die Zeile der englischen Sprache kopiert und _en durch _zh ersetzt.

Fallstricke

Insgesamt war es aufwändig, unterschiedliche Solr-Indexer für die chinesische Suche auszuprobieren. Keiner lieferte das gewünschte Ergebnis. Teilweise kamen gar keine Suchergebnisse. Zwischendurch wurde auch mal die Ausgabe für die englische und deutsche Suche getestet. Während die englische Suche immer funktionierte, waren die deutschen Suchergebnisse teilweise auch merkwürdig. Die Suche nach dem Begriff „Lösungen“ brachte beispielsweise zwar ganz viele Ergebnisse, das gesuchte Wort selber tauchte aber in der Ergebnisliste der deutschen Solr-Suche nicht auf.

Allmählich kristallisierte es sich heraus, dass es mit den deutschen Umlauten bzw. den chinesischen Schriftzeichen zu tun haben musste.
Nun ging also die Suche los.

  1. Prüfung aller beteiligten Templates, ob das Content-Encoding auf UTF-8 eingestellt –> passt
  2. Prüfung des defaultcontentencoding in der opencms-system.xml –> passt
  3. wandelt die AJAX-Komponente die Umlaute falsch um –> nein

Formulardaten, die per E-Mail verschickt wurden, kamen auch korrekt an. Also eigentlich an alles gedacht, oder?

Dann kam die Erleuchtung. Die Suchquerys werden in Solr als GET-Request verschickt.

Anschließend ging es schnell. Jetzt musste nur noch der Tomcat so konfiguriert werden, dass er GET-Requests UTF-8 kodiert:

Hierzu muss die server.xml des Tomcat angepasst werden:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

Auf einem Produktionsserver mit vorgeschaltetem Apache muss das auch beim AJP Konnektor hinzugefügt werden:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>

So das war’s!