Installation von solr für TYPO3

-- Update am 11.6.2012

Solr hat sich in den letzten Jahren im OpenSource Bereich zum de Facto Standard für Suchserver gemausert. Seit einiger Zeit gibt es eine TYPO3-Extension welche sich zum einen um die Indexierung der Inhalte und zum anderen um die Darstellung der Suche im Frontend kümmert. An dieser Stelle wird beschrieben, wie diese Such eingerichtet werden kann.

Solr Extension installieren

Auch wenn man meint, dass hier Schritt B vor Schritt A gemacht wird, ist es dennoch sinnvoll, zuerst die Extension zu installieren und danach den Solr Server aufzusetzen. Der Grund hierfür ist recht einfach: die Extension kommt mit einem shell-Skript, welches bei der Installation des Servers sehr hilfreich ist.

Die Installation der Extension ist denkbar einfach: Extension Manager öffnen --> Extension importieren --> 'solr' suchen --> Extension installieren.

Es werden zwei Datenbanktabellen angelegt und der Käs' ist gegessen.

Solr Server installieren

Das Skript für die Installation des solr Servers auf dem Webserver selber findet sich im Extension-Verzeichnis unter

/typo3conf/ext/solr/resources/shell/install-solr.sh

Mit dem Ausführen des Skripts wird neben solr ein tomcat-Server installiert, auf dem  der solr Server später läuft. Mit

sudo /typo3conf/ext/solr/resources/shell/install-solr.sh

wir die Installation gestartet.

Auf meinem Server musste vorher noch java und unzip installiert werden, das ging mit folgenden Befehlen:

sudo aptitude install openjdk-7-jre
sudo aptitude install unzip

Direkt im Anschluss an die Installation wird der solr Server gestartet und sollte bei richtiger Konfiguration unter

localhost/solr

erreichbar sein. Alle Dateien von Tomcat und Solr liegen nach der Installation übrigens unter 

/opt/solr-tomcat

Wichtig für die Administration des Servers sind die Skripte

/opt/solr-tomcat/tomcat/bin/startup.sh
/opt/solr-tomcat/tomcat/bin/shutdown.sh

um den Server hoch- bzw. runterzufahren.

Solr Server konfigurieren

Um den Zugriff auf den solr-Server "von aussen" (beispielsweise über einen Browser auf einem anderen Server) zu ermöglichen, muss die Datei /opt/solr-tomcat/tomcat/conf/server.xml angepasst werden. Dazu folgende Änderungen durchführen:

<Connector port="8080"
protocol="HTTP/1.1"                
maxHttpHeaderSize="65536" 
connectionTimeout="20000"
redirectPort="8443"
address="0.0.0.0" <!-- statt 127.0.0.1 -->
URIEncoding="UTF-8" />

Jetzt muss für unsere TYPO3-Anbindung noch ein sogenannter Core eingerichtet werden. Einen Core kann man sich vorstellen wie eine einzige, große Tabelle in einer Datenbank, in der alle Daten zu einer TYPO3-Installation verwaltet werden.

Um einen Core (für deutsche Sprache) anzulegen gehen wir wie folgt vor:

1. Der Server wird mit Hilfe von /opt/solr-tomcat/tomcat/bin/shutdown.sh heruntergefahren.

2. Um einen deutschen Core zu bekommen, müssen zuerst die entsprechenden Konfigurationen aus dem resources-Verzeichnis der TYPO3 solr-Extension in das solr/typo3cores/conf Verzeichnis kopiert werden:

sudo cp -a /var/www/site/typo3conf/ext/solr/resources/solr/typo3cores/conf/german german

3. Die Datei /opt/solr-tomcat/solr/solr.xml editieren und dort die folgenden Zeilen in den <solr><cores>-Tag eintragen:

<core name="typo3-de_DE" 
      instanceDir="typo3cores" 
      schema="german/schema.xml" 
      dataDir="data/typo3-de_DE" />

4. Die Datei speichern und schließen und den Server anschließend mittels 

sudo /opt/solr-tomcat/tomcat/bin/startup.sh

wieder starten.

Nach dem Neustart sollte ein entsprechendes Daten-Verzeichnis für den konfigurierten Core angelegt sein, man findet es unter 

/opt/solr-tomcat/solr/typo3cores/data/core-de_DE

Sollte dies nicht der Fall sein, lohnt ein Blick in die Tomcat Logfile unter

/opt/solr-tomcat/tomcat/logs/catalina.yyy-mm-dd.log

Extension konfigurieren

Für die Konfiguration der Extension sind mehrere Schritte erforderlich

1. Root Page festlegen und Domain-Record anlegen

Solr braucht innerhalb des Seitenbaums eine definierte Root-Page und einen darauf befindlichen Domain-Record um Inhalte korrekt indexieren zu können. Dazu die Startseite der Website bearbeiten und das Häkchen bei "Use as Root Page" setzen.

Danach mit Hilfe des Listen-Moduls im Backend einen Domain-Record anlegen, indem der Domain-Namen für die Root-Seite festgelegt wird.

2. TypoScript Konfiguration für solr einrichten

Für die Konfiguration der solr Extension wird ein statisches Template eingebunden, in dem die wesentliche Konfiguration beinhaltet ist. Dazu auf der soeben festgelegten root-Seite den Template-Editor öffnen und unter include static "Apache Solr (solr)" auswählen.

Neben den Einstellungen des statischen Setups muss nun noch der solr Server und der zu verwendende Core definiert werden. Dazu folgende Zeilen TypoScript in das Setup der Root-Seite schreiben:

plugin.tx_solr.solr {
	host = localhost
	port = 8080
	path = /solr/core-de_DE
	scheme = http
}

3. Konfiguration testen

Ob die Konfiguration funktioniert hat, verrät ein Blick in das Reports-Modul. Dort gibt es nach der Installation von solr eine neue Rubrik "Apache Solr Index" unter der man einen Statistik seines solr Indexes bekommt, wenn die Konfiguration stimmt. 

Tipp: Wenn ein Fehler kommt, zuerst mal den Cache leeren. Wenn es dann immer noch nicht geht, hilft ein Blick ins developer log. Dort schreibt solr alle seine Warnmeldungen und log-Ausgaben hin!

Indexierung konfigurieren und Indexqueue füllen

Die Indexierung der Seiteninhalte ist in der Standard-Typoscript Konfiguration bereits enthalten. Die Konfiguration für die Indexierung anderer Inhalte wie tt_news etc. werde ich in einem weiteren Blog-Post beschreiben.

Damit die Indexierung auf funktioniert, müssen im Frontend die entsprechenden Marker im HTML Quellcode ausgegeben werden: <!--TYPO3SEARCH_begin--> und <!--TYPO3SEARCH_end--> Diese Kommentare müssen entsprechend in das HTML-Template der Seite oder in das TypoScript Template aufgenommen werden.

Der erste Schritt für die Indexierung von Seiteninhalten besteht nun darin, die Index Queue mit Inhalten zu füllen. Dazu wird das Modul "Search" benutzt, das mit der solr Extension installiert wird. Hier die Aktion "Initialize Index Queue" ausführen.

Der Erfolg dieser Operation kann mit Hilfe von phpMyAdmin überprüft werden. Dazu die Tabelle "tx_solr_indexqueue_item" betrachten. Hier sollten nun Einträge für die einzelnen Seiten vorliegen.

Damit weiß die solr Extension nur "was" indexiert werden soll. Die Indexierung selber ist an dieser Stelle noch nicht durchgeführt. Dafür müssen im nächsten Schritt Scheduler Tasks eingerichtet werden, die sich um die eigentlich Indexierung kümmern.

Scheduler für Indexierung einrichten

Für die eigentliche Indexierung der Inhalte muss ein CRON Job über den TYPO3 Scheduler eingerichtet werden. Sollte der Scheduler noch nicht aktiviert sein, muss dieser zunächst im Extension Manager installiert werden.

Im Modul "Scheduler" kann nun ein neuer Task "Index Queue Worker (solr)" hinzugefügt werden. Zum Testen kann dieser zunächst auf "Single" eingerichtet werden, so dass er im Scheduler Modul von Hand gestartet werden kann. Später kann der Task dann so umgestellt werden, dass er über den Scheduler automtatisch gestartet wird.

Ein zweiter Task wird dafür eingerichtet, dass solr die indexierten Daten auch committed. Dazu den vordefinierten Task "Commit solr index (solr)" auswählen und ebenfalls vorerst als "Single" einrichten.

Danach sollten die folgenden zwei Task im Scheduler auftauchen:

Zum Testen empfiehlt es sich an dieser Stelle beide Tasks einmal auszuführen (zuerst index queue worker, dann commit). Danach kann mit Hilfe der solr admin Webseite überprüft werden, ob Daten in den solr Index geschrieben wurden. Dazu die URL localhost/solr aufrufen und den entsprechenden core auswählen. Eine Anfrage nach *:* sollte die ersten 10 Dokumente im Index ausspucken:

Wie geht's weiter?

Wenn jetzt Dokumente im Index angezeigt werden, ist die Installation und Konfiguration von Server und Extension erfolgreich gewesen. Die nächste Aufgabe besteht nun darin, die Frontend-Plugins einzubinden um die eigentliche Suchmaschine darzustellen. Diese Arbeiten möchte ich an dieser Stelle nicht weiter beschreiben. Statt dessen möchte ich noch ein paar Tips für die Fehlersuche und Behebung geben.

Troubleshooting TYPO3 solr extension

1. Devlog anschauen

Die solr Extension macht regen Gebrauch des developer logs in TYPO3 mit Hilfe des Backend Moduls "devlog" können die logs durchsucht werden, meist kommt in den Daten eine ausführliche Fehlermeldung und man bekommt einen Hinweis, an welcher Stelle zu suchen ist.

Ein ausführliches Logging konfiguriert man in solr über plugin.tx_solr.logging in TypoScript

2. Tomcat log anschauen

Wie bereits beschrieben, schreibt auch tomcat ein Logfile, welches sich vor allem zu lesen lohnt, wenn der solr Server selbst nicht richtig startet oder nicht wie erwartet funktioniert.

3. phpMyAdmin und indexqueue

Mit Hilfe der IndexQueue kann untersucht werden, welche Seiten und Datensätze vom Indexer verarbeitet werden oder verarbeitet wurden.

4. Verstehen, was wo passiert um Fehler zu suchen

Für die Fehlersuche in der solr Extension ist es wichtig zu verstehen, was an welcher Stelle passiert. Der Unterschied zwischen dem Erstellen der index queue und dem Abarbeiten der index queue ist ein wichtiger erster Schritt für dieses Verständnis.

Befinden sich Elemente nach dem Initialisieren der Index Queue nicht wie erwartet in der entsprechenden Tabelle, läuft etwas bei der Erstellen der Queue falsch. Sind die Elemente erst mal in der Queue und landen beim Indexieren selbst nicht im Index, so läuft etwas beim Indexieren falsch.

Ausgangspunkt für die Initialisierung der Index Queue ist tx_solr_indexqueue_Queue mit der Methode "initialize()". Hier wird die Initialisierung gestartet.

Ausgangspunkt für die Indexierung selbst ist der Scheduler Task tx_solr_scheduler_IndexQueueWorkerTask mit der Methode "execute()". Beim Indexieren von Seiten erfolgen zwei asynchrone Aufrufe von TYPO3 auf sich selbst:

1. Ermitteln der auf einer Seite befindlichen Usergruppen (FE) zum Setzen der Zugriffsrechte im indexierten Dokument.

2. Rendern der Seite aus Sicht jeder einzelnen Usergruppe mit dem Kommando, sich selbst zu indexieren.

Das Indexieren selbst findet also nicht im Scheduler-Task statt, sondern wird mit Hilfe eines Seitenaufrufs auf die TYPO3 Seite selbst in Gang gesetzt.

5. localhost in /etc/hosts eintragen

Wenn der Eintrag "localhost" in der /etc/hosts Datei fehlt, gibt es Probleme. Genau so kann es Probleme geben, dass solr versucht, seinen eigenen Hostnamen zu ermitteln und dabei bei einem Namen landet, der *NICHT* in der /etc/hosts steht. Die entsprechende Fehlermeldung in catalina.out sieht dann etwa folgendermaßen aus:

 

SCHWERWIEGEND: java.net.UnknownHostException: <komischer servername>

        at java.net.InetAddress.getLocalHost(InetAddress.java:1426)

        at org.apache.solr.handler.admin.SystemInfoHandler.getCoreInfo(SystemInfoHandler.java:82)

        at org.apache.solr.handler.admin.SystemInfoHandler.handleRequestBody(SystemInfoHandler.java:64)

        at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)

        at org.apache.solr.core.SolrCore.execute(SolrCore.java:1372)

        at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:356)

        at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:252)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)

        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)

        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

        at java.lang.Thread.run

 

In diesem Fall schafft der Eintrag des <komischen servernamen>'s mit der IP 127.0.0.1 in die /etc/hosts Abhilfe.

 

Weitere Informationsquellen

solr Projektseite auf forge.typo3.org - http://forge.typo3.org/projects/extension-solr

solr Extension wiki auf forge.typo3.org - http://forge.typo3.org/projects/extension-solr/wiki

solr Wiki - http://wiki.apache.org/solr/

typo3-solr Webseite - http://www.typo3-solr.com/

 


 
Inhalt © Michael Knoll 2009-2017  •  Powered by TYPO3  •  TypoScript Blogging by Fabrizio Branca  •  TYPO3 Photo Gallery Management by yag  •  Impressum