Vorwort: wieso ein Blog zu PHP, Solr und Lucene?

Wieso ein Blog zu PHP, Solr und Lucene?
Gegenstand und Ausgangspunkt all unserer Aktivitäten auf diesem Gebiet war ein Projekt um ein Nachrichtenportal und die Aufgabe, Recherchen und Analysen im Nachrichtenbestand von über 10 Million News performant zu handeln. Die MySQL Volltextsuche kam da schnell an Ihre grenzen, Oracle war keine Alternative.
Es reifte also die Frage, wie können andere (etwa die Internetsuchmaschiene google) immense Datenmengen spielend handeln?
Wir lösten den MySQL volltext mit Lucene ab. Der Performancegewinn war dramatisch. Suchen im Datenbestand, die vorher über 10 Sekunden dauerten, brauchen mittels Lucene und Solr nur selten mehr als 20ms!
Eine neue Welt tat sich auf, die es zu erobern galt und schnell fiel auf, dass deutschsprachige Seiten zum Thema Mangelware sind. Dies soll sich mit diesem Blog ein wenig ändern.

Sie haben Fragen zu Solr/Lucene/PHP? Schreiben sie uns einen Kommentar!

Montag, 24. September 2012

Solr Probleme mit Umlauten

Während Lucene eine Java Bibliothek ist, ist Solr die Java Anwendung, die diese Bibliothek nutzt. Wie für jede Java Anwendung wird auch für Solr eine Laufzeitumgebung benötigt.
Idealer Weise gibt es seit einigen Versionen von Solr beim offiziellen Download eine All-in-one Variante.
Darin werden geliefert: sämtliche Bibliothken, die man für besondere Solr Funktionen (Clustering, Dataimport Handler, Velocity, ...) benötigt, die Solr Anwendung selber und Jetty. Jetty ist ein kleiner Java Anwendungsserver, in dessen man die Solr Anwendung deployen, also installieren & laufen lassen kann.
Das funktioniert in aller Regel super...
...so lange man nicht versucht, deutsche Umlaute, also äöü und ß zu verarbeiten.



Mir scheint, dass Solr im Jetty Probleme hat mit deutschen Umlauten. Einige Stunden haben wir im Web aufgebracht, um eine Lösung zu finden und sind letztlich dazu über gegangen, einen anderen Anwendungsserver zu nutzen, denn Solr / Lucene können tatsächlich mit deutsch Umlauten umgehen. Ä, Ü, Ö und ß sind für sie kein Problem. Nur in Kombination mit Jetty scheint es zu haken.

Die Beschreibung zur Tomcat (ehemals Catalina) installation findet sich im Solr Apache Wiki.
Hinsichtlich der Startparameter ist alles recht übersichtlich und normal:

ulimit -v unlimited
export JAVA_HOME=/usr/lib64/jvm/java-1_6_0-ibm-1.6.0/jre/
export JAVA_OPTS="-Xms2048m -Xmx4096m"
export TOMCAT_USER=root
export CATALINA_HOME=/opt/tomcat6
export CATALINA_PID=$CATALINA_HOME/bin/tomcat6.pid

Das ulimit ist wichtig, wenn man größere Datenmengen verarbeitet. Der Rest: Speicherparameter und Pfade wählt jeder solber und der tomcat user sollte zumindest in einer produktiven Umgebung auch nicht root sein, wie hier im Beispiel.

Im nächsten Schritt müssen wir den Tomcat mit Solr vertraut machen. Dazu gibt es eine Konfigurationsdatei, die wir anlegen:
/opt/tomcat6/conf/Catalina/localhost/solr.xml

Auch hier ist der Inhalt übersichtlich, wichtig ist der Hinweis auf UTF-8, damit es mit den deutschen Umlauten auch sicher klappt.
<?xml version="1.0" encoding="utf-8"?>
<Context docBase="/opt/solr/apache-solr.war" debug="0" crossContext="true">
  <Environment name="solr/home" type="java.lang.String" value="/opt/solr/" override="true"/>
</Context>

Hilfreich ist darüber hinaus ein Blick in die server.xml des tomcat: /opt/tomcat6/conf/server.xml, ob der Connector mit URIEncoding="UTF-8" läuft:

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



Der Rest gehört zur klassischen Solr Konfiguration und Solr Installation.
Der Vollständigkeit halber noch der Hinweis, dass unser gesamtes Linuxsystem an jeder möglichen Konfigurationsstelle auf UTF-8 steht.
In der Summe funktionieren deutsche Umlaute nun reibungslos.

2 Kommentare:

  1. Hallo thx,

    ich habe es genau umgekehrt erlebt - nämlich, dass mit Jetty die Umlaute komplett funktioniert haben, aber bei Tomcat(7) erst einige Einstellungen von Nöten waren, um es überhaupt zum Laufen zu bekommen.

    Ich muss dazu sagen, dass wir
    1) mit Ruby
    2) per POST mit solr
    kommunizieren.

    Dank 2) bringt das von Dir genannte Setting im Connector überhaupt nichts. Ich musste den folgenden Filter im $SOLR_HOME/WEB-INF/web.xml anlegen:


    SetCharacterEncoding
    org.apache.catalina.filters.SetCharacterEncodingFilter

    encoding
    UTF-8


    ignore
    true



    Vielleicht hilft das ja dem ein oder anderen weiter.

    AntwortenLöschen
  2. Danke! Für uns hat es gereicht die server.xml zu editieren und 'URIEncoding="UTF-8"' einzufügen.

    AntwortenLöschen