25.07.2014
Author: Kai Schliemann, K.Schliemann@comundus.com

Einrichtung der Enterprise Search Solr für eine mehrsprachige Webseite in OpenCms

Vorwort

Für unseren Kunden Sycor GmbH realisierten wir im Jahre 2013 deren internationalen Webauftritt mit OpenCms 8.5.1 in den Sprachen Deutsch und Englisch. Vor einem Monat kam Chinesisch dazu.
 

Für eine komfortable Suche bringt OpenCms standardmäßig die auf der Open Source Suchengine Lucene basierende Enterprise Search-Platform 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 à la Google erfüllt. 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

Wichtig ist, 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 ist noch keine Konfiguration vorhanden. Im folgenden Kapitel wird beschrieben, welche Einstellungen 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 <types> 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 <fields> 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

Ich habe viel Zeit damit verbracht, unterschiedliche Solr-Indexer für die chinesische Suche auszuprobieren. Keiner lieferte das gewünschte Ergebnis. Teilweise kamen gar keine Suchergebnisse. Zwischendurch testete ich auch mal die englische und deutsche Suche. 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.

So langsam kam ich auf den Trichter, 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.

Nun ging es vollends 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 dass war's!


Kai-Schliemann
Kai Schliemann
Produktmanager OpenCms

E-Mail an: Kai Schliemann Tel: +49 7151 96528-0

>> Kontaktformular