Enterprise Search Server trifft Enterprise Content Management: Apache Solr für TYPO3
Jedem erfahrenen TYPO3-Anwender sollte bekannt sein, dass die mit TYPO3 als Systemextension ausgelieferte „Indexed Search“ zwar für kleinere Websites völlig ausreichend ist, sie aber bei größeren Auftritten ab einer Größe von etwa 500 Seiten und zusätzlich einigen News schnell zum Flaschenhals der Website werden kann. Zudem ist Indexed Search auch in puncto Funktionsumfang etwas in die Jahre gekommen.
Besonders diese beiden Gründe bewegten die Frankfurter TYPO3-Agentur dkd dazu, nach einem Ersatz für Indexed Search zu suchen. Andere bereits existierende Suchlösungen für TYPO3 [1] waren zwar ebenfalls interessant, konnten den Anforderungen aber dennoch nicht gerecht werden. Wichtige Kriterien waren Performance, Funktionsumfang sowie die Möglichkeit, auch Inhalte aus Drittsystemen oder statischen Websites indizieren zu können und über eine zentrale Suche zugänglich zu machen. All das und noch mehr leistet Apache Solr.
Einblicke
Ursprünglich wurde Solr vom Review- und Tech-News-Portal CNET entwickelt. 2006 entschied sich CNET, den Source-Code für Solr der Apache Software Foundation zu übergeben. Seit dem ist Solr ein Open-Source-Projekt der Apache Software Foundation, genauer gesagt eines von mehreren Unterprojekten von Apache Lucene. Solr ist, wie Lucene, in Java entwickelt und läuft als Webanwendung in jedem Java-Servlet-Container wie Jetty oder Tomcat. Auf einem Lucene-Index basierend, bietet Solr eine REST-ähnliche Schnittstelle und fügt weitere Funktionen hinzu, die Lucene alleine nicht bietet. Die wichtigsten Solr-Features im Überblick:
- Suchworthervorhebung
- Flexibles Ergebnis-Boosting
- Facettierte Suche
- Rechtschreibprüfung/Meinten Sie …?
- Ähnlichkeitssuche
- Suchwortvorschläge/Autosuggest
- Index-Replikation und Verteilung/Cluster
- Frei anpassbare Indexstruktur
- Flexible Anbindung an Drittsysteme und Datenbanken
- REST-ähnliche HTTP/XML- und JSON-API
- Benötigt keine bis wenige Java-Kenntnisse
Neben Solr gibt es im Lucene-Umfeld noch weitere spannende Schwesterprojekte, die ebenfalls gut mit Solr zusammenspielen. Tika wurde in Solr 1.4 integriert und dient zur Extraktion von Inhalten und Metadaten aus Dokumentformaten wie Microsoft Word und Excel, OpenOffice, PDF und ähnlichen. Mit Nutch lassen sich Crawler entwickeln, die gefundene Inhalte in einem Solr-Index ablegen können.
Eine der hilfreichsten Funktionen für den Endanwender ist dabei sicherlich die facettierte Suche. Versucht man bisher bei Suchmaschinen wie Google seine Suche mit möglichst vielen Begriffen so genau wie möglich zu spezifizieren, so dreht die facettierte Suche dieses Prinzip um: Man beginnt mit einem eher generellen Suchbegriff, die daraus resultierende Ergebnisliste kann man dann über Filter weiter einschränken, bis man das gewünschte Ergebnis gefunden hat. Werden nach dem Anwenden eines Filters plötzlich nicht mehr die gewünschten Ergebnisse angezeigt, so kann man die Filter in beliebiger Reihenfolge wieder entfernen. So kann sich der Besucher spielerisch zum gesuchten Ergebnis durchhangeln, gleichzeitig stellt die facettierte Suche aber auch sicher, dass nur Filter angeboten werden, die in der aktuellen Kombination aus eventuell schon gewählten und vorgeschlagenen Filtern immer mindestens ein Ergebnis liefern.
EXT:solr – Apache Solr für TYPO3
Die TYPO3-Extension „solr“ integriert Solr und seine mächtigen Funktionen in das beliebte CMS. Ein Prototyp wurde bei der Agentur dkd bereits im Sommer 2008 entwickelt, bevor die richtige Entwicklung im Februar 2009 begann. Anhand von Anforderungen aus Kundenprojekten wurden bis zur Veröffentlichung der Version 1.0 zur T3CON09 in Frankfurt zahlreiche Funktionen hinzugefügt.
Bei der Entwicklung wurde konsequent darauf geachtet, möglichst aktuelle Technologien zu verwenden. So benötigt man für den Betrieb etwa TYPO3 4.3. Außerdem achteten die Entwickler bei der Umsetzung auf eine einfache Erweiterbarkeit durch verschiedene Hooks und Interfaces sowie eine saubere und logische Strukturierung der Extension. Gleiches gilt für die Konfiguration: Generell wird die Extension komplett über TypoScript konfiguriert, egal ob dies das Frontend oder das Backend betrifft. Alle Optionen sind in Gruppen geordnet, was das Finden einer bestimmten Option enorm erleichtert.
Bezüglich der Integration in TYPO3 war das primäre Ziel zunächst, einen Ersatz für Indexed Search zu schaffen. Dies ist mit Version 1.0 gelungen, zusätzlich wurden aber schon weitere Funktionen integriert, die Indexed Search nicht bietet. Dazu gehören die Suchworthervorhebung in der Suchergebnisliste, Rechtschreibprüfung, Sortierung der Ergebnisse nach beliebigen Kriterien, Integration der mit TYPO3 4.3 eingeführten Module „Scheduler“ und „Reports“ und als besonderes Highlight die facettierte Suche.
Workshop: Solr selbst verwenden
Lucene ist zwar in Java entwickelt, doch Solr bewahrt Entwickler davor, selbst Java programmieren zu müssen. Die Solr-Extension kommuniziert mit dem Solr-Server über HTTP. Der folgende Workshop zeigt Ihnen, wie Sie die mächtige Solr-Suche selbst verwenden können. Vorraussetzung ist lediglich ein installiertes und aktuelles Java-SDK. Obwohl viele Linux-Distributionen mit Open JDK ausgeliefert werden, haben die Entwickler der Solr-Extension mit dem JDK von Sun bessere Erfahrungen gemacht.
Um Solr zu installieren, müssen Sie lediglich einige einfache Schritte durchführen: Als erstes laden Sie sich die Extension (Key „solr“) aus dem TER herunter und installieren sie in TYPO3. Die Extension enthält einen Ordner „resources“, darin finden Sie drei Ordner, die Sie nacheinander brauchen werden. Führen Sie das Shell-Skript „install-solr.sh“ aus dem Ordner „shell“ aus, dieses lädt die benötigten Komponenten Tomcat 6 und Solr 1.4 von den Apache-Servern herunter und installiert beide im Ordner „/opt/solr-tomcat/“. Danach läuft Solr bereits und Sie können die Solr-Admin-Oberfläche über http://localhost:8080/solr/admin/ aufrufen.
Im Extension-Ordner „resources/tomcat/“ finden Sie ein Skript zum Start und Stop von „tomcat6“, das Sie einfach nach „/etc/init.d/“ kopieren können, um Ihren neuen Tomcat-Server damit komfortabel zu starten und zu stoppen.
Die Datei „solr.xml“ aus dem gleichen Ordner kopieren Sie nach „/opt/solr-tomcat/apache-tomcat-6.0.20/conf/Catalina/localhost/“. Diese Datei setzt einige Umgebungsvariablen, die für den Betrieb des Solr-Servers nötig sind.
Als nächstes kopieren Sie nun noch die beiden Dateien „schema.xml“ und „solrconfig.xml“ aus dem Extension-Ordner „resources/solr/“ nach „/opt/solr-tomcat/solr/conf/“. „schema.xml“ legt fest, welche Feldtypen und Felder der Index haben kann, „solrconfig.xml“ dient zur Konfiguration des Solr-Servers selbst. Nun noch den Tomcat-Server neu starten, damit die Konfiguration angewendet wird. Damit ist die Installation von Tomcat und Solr erledigt und Sie können sich der Konfiguration der TYPO3-Extension widmen, auch hier sind nur wenige Schritte nötig.
Wie bei Indexed Search müssen Sie auch bei Solr über TypoScript das Indizieren von Seiten prinzipiell aktivieren. Dazu setzen sie „config.index_enable = 1“. Laden Sie nun noch das statische TypoScript-Template, das mit der Extension mitgeliefert wird, und überprüfen Sie die Konfiguration der Verbindungsparameter „host“, „port“ und „path“ unter „plugin.tx_solr.solr“. Diese können Sie, sofern nötig, sowohl über den Konstanteneditor als auch direkt über Setup ändern und falls nötig für Ihren Solr-Server anpassen.
Bei der Startseite der Website muss die Checkbox „Is root of website“ aktiviert und in der HTML-Frontend-Ausgabe die zu indizierenden Bereiche mit den Markern „<!– TYPO3SEARCH_begin –>“ und „<!– TYPO3SEARCH_end –>“ umgeben sein. Damit haben Sie die Basisinstallation und Konfiguration abgeschlossen.
Konfiguration für den Testbetrieb |
Die „solrconfig.xml“ enthält Einstellungen für den Livebetrieb eines Solr-Servers. Um die Performance zu steigern, werden die Seiten zwar (wie bei Indexed Search) beim Aufruf im Frontend indiziert und an Solr übergeben, aber sie sind damit noch nicht sofort im Index auffindbar. Erst nach einem Commit in den Solr-Index ist dies der Fall. Die mitgelieferte „solrconfig.xml“ sorgt dafür, dass ein Commit immer nach höchstens 100 hinzugefügten Dokumenten (Seiten) oder nach höchstens einer Stunde automatisch ausgeführt wird, je nachdem was zuerst eintritt. Für Entwicklungszwecke ist das natürlich nicht optimal. Um dies zu ändern, öffnen Sie die „solrconfig.xml“, suchen nach „autoCommit“ und ändern den Wert für „maxDocs“ auf 1, damit wird nach jedem indizierten Dokument ein Commit ausgeführt. Nicht vergessen, den Tomcat neuzustarten, um die Änderungen wirksam zu machen. |
In Solr/Lucene besteht der Index aus Dokumenten, diese wiederum bestehen aus einer flexiblen Anzahl von Feldern, die die eigentlichen Informationen enthalten. Ein Dokument muss nicht alle im Index definierten Felder enthalten. In TYPO3 entspricht ein Dokument einer Seite oder einem Datensatz. Die mitgelieferte „schema.xml“ definiert für TYPO3 sinnvolle Indexfelder und die Extension kümmert sich beim Indizieren darum, diese möglichst komplett zu füllen. Wollen Sie dazu noch weitere Informationen indizieren, können sie diese zusätzlichen Indexfelder über TypoScript konfigurieren.
plugin.tx_solr.index.additionalFields.FELDNAME = FELDWERT
Listing 1
Plugin einfügen und konfigurieren
Nachdem nun der Solr-Server läuft und die Indizierung von Seiten funktioniert, müssen Sie natürlich auch noch eine Möglichkeit schaffen, um tatsächlich im Index zu suchen.
Fügen Sie dazu auf einer Seite ein Content-Element vom Typ „Plugin“ ein, als Plugin wählen Sie „Solr Search“. Als Zielseite wählen Sie die Seite, die die Suchergebnisse anzeigen soll. Diese Einstellung können Sie aber auch zentral über Typoscript unter „plugin.tx_solr.search.targetPage“ vornehmen. Das reicht, um das Suchformular einzufügen. Weitere Komponenten können Sie per TypoScript aktivieren:
//Suchworthervorhebung in der Ergebnisliste plugin.tx_solr.search.highlighting = 1 //Rechtschreibprüfung plugin.tx_solr.search.spellchecking = 1 //Sortieren von Ergebnissen plugin.tx_solr.search.sorting = 1 plugin.tx_solr.searchResultsViewComponents.sorting = 1 //Facettierte Suche plugin.tx_solr.facetting = 1 plugin.tx_solr.searchResultsViewComponents.facetting = 1
Listing 2
In Version 1.0 der Extension sind zunächst zwei Facetten vorkonfiguriert: Typ und Autor. In kommenden Versionen werden weitere hinzukommen. Sie können aber auch jetzt schon selbst weitere Facetten anlegen.
Hinweise zur facettierten Suche |
Die facettierte Suche funktioniert über Filter, diese können aber nur auf einfachen Feldtypen sinnvoll verwendet werden, also String, Integer, Float und Boolean. Um neue Felder dieser Typen im Index anzulegen, müssen Sie die „schema.xml“ nicht einmal bearbeiten. Solr bietet sogenannte Dynamic Fields, bei diesen kommt es einfach nur auf den Namen an, je nach Endung wird der Typ des Felds bestimmt. Endet der Feldname mit „_i“, ist es ein Integer Feld, „_f“ für Float, „_s“ für String und „_b“ für Boolean. |
Um das Verhalten der Extension während der Entwicklung beobachten zu können, ist an vielen Stellen Logging implementiert. Dieses können Sie für die unterschiedlichen Teile der Extension separat aktivieren und deaktivieren. Dazu setzen Sie die gewünschten Schalter unter „plugin.tx_solr.logging.SCHALTER“ auf 1. Die Logmeldungen können Sie dann mit der Extension „devlog“ ansehen.
Entwicklungsmodell und Roadmap
Von Anfang an war klar, dass die Extension der TYPO3-Community zur Verfügung gestellt werden soll. Allerdings ist die Entwicklung einer solch umfangreichen Extension – der Aufwand wurde zu Beginn auf 150 Manntage geschätzt – mit Kosten verbunden. Daher hat sich dkd für ein bewährtes Entwicklungsmodell aus Kooperation von Entwicklungspartnern und der Community entschieden.
Dabei streckt dkd die Entwicklungskosten vor und macht der Community Teile der Weiterentwicklung regelmäßig frei zugänglich. Die Version 1.0 war der erste Schritt in diese Richtung. Die veröffentlichte Version enthält allerdings nicht alle bereits entwickelten Funktionen und ist zudem auf den Einsatz mit TYPO3 4.3 beschränkt. Bei den meisten unveröffentlichten Funktionen handelt es sich aber um solche, die noch nicht fertig entwickelt oder noch nicht stabil genug sind, um sie veröffentlichen zu können. Wen diese Einschränkungen nicht stören, kann sich die Extension kostenlos aus dem TER herunterladen.
Gleichzeitig besteht aber auch die Möglichkeit, sich an der Finanzierung und Weiterentwicklung der Extension aktiv zu beteiligen. Mit der Entwicklungsbeteiligung wird den Partnern voller Zugriff auf den aktuellen Entwicklungsstand (trunk) gewährt. Auf Wunsch können Partner auch schreibenden Zugriff auf das Entwicklungsrepository bekommen. Zusätzlich zu noch nicht veröffentlichten Funktionen unterstützt diese Version der Extension auch die TYPO3-Version 4.2 und für manche Zwecke auch 4.1.
Mit Erscheinen dieses Artikels sollte Version 1.1 der Solr-Extension im TER verfügbar sein und wieder einige neue Funktionen aus der aktuellen Entwicklung bereitstellen.
Das ursprüngliche Ziel – einen Ersatz für Indexed Search zu bieten – hat die Extension seit einiger Zeit erreicht und mittlerweile deutlich überschritten. Im Laufe des Jahres soll dann Version 2.0 folgen, die noch konsequenter auf Technologien von TYPO3 4.3 oder 4.4 setzen wird. Zum einen wird gerade eine Indexing-Queue implementiert, mit der Inhalte unabhängig von Frontend-Aufrufen indiziert werden. Bei Änderungen im Backend werden diese registriert und die Informationen kurz darauf im Index aktualisiert, ohne auf einen Seitenaufruf warten zu müssen, auch ein Crawler wird nicht mehr nötig sein. Außerdem wird die Indexing-Queue den Programmieraufwand deutlich verringern, der nötig ist, um zusätzliche Inhalte und ganze Datenbanktabellen zu indizieren. Was indiziert werden soll, kann dann einfach über die Konfiguration bestimmt werden.
Die Template-Engine wird auf Fluid umgestellt und Plugins werden zumindest Teile von Extbase nutzen. Dazu kommt ein auf Extbase basierendes Backendmodul, um die Administration weiter zu vereinfachen.
Bereits fertig sind die Unterstützung für weitere Suchkomponenten wie automatische Suchwortvorschläge/Suggest, Ähnlichkeitssuche, häufig gesuchte Wörter, letzte Suchen und hierarchische Facetten. Für das in TYPO3 4.3 eingeführte Reportmodul steht ein neuer Report bereit, der einen Blick auf die Felder im Index gewährt, ein Statistikreport ist in Entwicklung.
Als Schwesterprojekt befindet sich eine Erweiterung in Entwicklung, die die Funktionen von Apache Tika als Services in TYPO3 zur Verfügung stellen wird. Damit lassen sich dann Inhalte und Metadaten aus über 600 Dateiformaten extrahieren. Die Solr-Extension wird die Tika-Extension nutzen, um Inhalte und Metadaten etwa aus PDF-, OpenOffice.org- und Microsoft-Dateien zu extrahieren. Genauso kann die Tika-Extension aber auch für DAM genutzt werden, um Metadaten aus Audiodateien und Bildern zu extrahieren. Damit ist statt der vielen bisher nötigen Metadatenextraktoren nur noch ein einziger nötig. Noch dazu kommt, dass die Tika-Extension entweder mit einer alleinstehenden Tika-CLI-App genutzt oder (falls vorhanden) ein Solr-Server genutzt werden kann, da ab Solr 1.4 Tika bereits integriert ist.
Links und Literatur
Für einen tieferen Einstieg in Solr ist das Solr Wiki [2] die erste Anlaufstelle. Dazu kommt die Apache-Solr-Mailingliste [3] und die umfassende Referenz von Lucid Imagination [4], einem Startup aus dem Umfeld der Solr-Entwickler. Wer Bücher mag, dem sei das Buch „Solr 1.4 Enterprise Search Server“ [5] empfohlen.
Auch im TYPO3-Projekt gibt es eine Mailingliste und Newsgroup zur Solr-Extension [6]. Wer Solr erstmal ohne Installation ausprobieren möchte, wird bei der Solr-Demo von dkd [7] fündig, die eine Suche über die TYPO3-Mailinglisten bietet und deren Index rund 175.000 Einträge enthält.