Anzeige
Anzeige
Software & Entwicklung
Artikel merken

Workshop: Die Indexed-Search-Alternative Lucene in TYPO3 integrieren

Die in TYPO3 integrierte Such-Engine Indexed Search ist für viele Websites ausreichend. Doch bei großen Datenmengen und komplexen Suchabfragen geht die Indexed Search in die Knie. Das Apache-Projekt Lucene ist eine leistungsfähige Alternative, die deutlich mehr Geschwindigkeit und Funktionalität verspricht. Dieser Workshop zeigt, wie man Lucene in TYPO3 integriert.

6 Min. Lesezeit
Anzeige
Anzeige

Die TYPO3-eigene Suche Indexed Search verrichtet in vielen Websites gute Arbeit und bietet eine Volltextsuche mit verschiedenen Konfigurationsmöglichkeiten und Funktionen. Bei Websites mit sehr vielen Inhalten und hohen Anforderungen an die Suche gibt es allerdings zwei Nachteile: Suchanfragen dauern sehr lange und spezielle Funktionen, etwa eine Suche nach Zeiträumen oder ähnlichen Schreibweisen, lassen sich nur bedingt umsetzen.

Anzeige
Anzeige

Ein Testszenario macht die Performanceschwäche deutlich. Die Basis bildet eine TYPO3-Website mit rund 11.000 Inhaltsseiten, gefüllt mit zufällig generiertem Inhalt. Das Ergebnis: Die Bearbeitung von Such­anfragen mit einem Begriff dauert auf einem durch­schnittlichen Entwicklungsserver zwischen 30 Sekunden und zweieinhalb Minuten. Um es vorwegzunehmen: Die gleiche Anfrage erledigt Lucene in ein bis zwei Sekunden.

Lucene

Lucene ist eine Hochleistungs-Volltextsuchmaschine von Apache [1] und kommt aus der Java-Welt, in Java-Projekten ist sie entsprechend häufig zu finden. Sie zeichnet sich durch eine eigene Art der Indizierung und einen großen Funktionsumfang aus. Lucene nutzt keine Datenbank, sondern das Filesystem und bietet so eine hohe Skalierbarkeit. Funktionen wie eine phonetische Suche, Suche nach ähnlichen Schreibweisen oder die Nutzung von „Boost Factors“ zur Priorisierung von einzelnen Attributen für ein Suchranking machen die Suchmaschine so attraktiv.

Anzeige
Anzeige

Mit „Zend_Search_Lucene“ existiert eine PHP-Variante von Lucene, die Teil des Zend Frameworks ist [2]. Aufbauend auf Lucene gibt es den Suchserver Solr [3], der die Funktionalitäten in einem per Web Services ansteuerbaren Server kapselt.

Anzeige
Anzeige

Möglichkeiten zur Integration in TYPO3

Die bisher einzige frei verfügbare TYPO3-Extension, die Lucene in TYPO3 integriert, heißt PowerSearch [4]. Sie nutzt das Zend Framework als Extension [5], ist also vollständig PHP-basiert. Zur PowerSearch-Erweiterung gehören noch zwei weitere Extensions („PowerSearch Index Lucene“ und „PowerSearch UI Default“), alle drei lassen sich anhand der Dokumentation recht einfach installieren. Die Extensions stellen lediglich das Grundsystem ohne erweiterte Funktionen bereit und indizieren ausschließlich „tt_content“. Die Indizierung erledigt ein Cronjob über die Datenbank, was impliziert, dass für jede zu indizierende Tabelle neuer Quellcode geschrieben werden muss. Hierfür ist die Architektur allerdings auch ausgelegt.

Für den Suchserver Solr ist eine Extension in Arbeit [6]. Solr ist insbesondere dann sinnvoll, wenn eine technologieübergreifende Lösung, die Original-Java-Lucene oder die neueste Version benötigt werden. Die Extension wird nach Angaben der Entwickler bei der d.k.d GmbH noch in diesem Jahr im TER verfügbar sein. Für den Einsatz ist mindestens ein Tomcat-Server erforderlich.

Anzeige
Anzeige

Integration über eine eigene Extension

Sieht man sich die API der Zend Search genauer an, gehört zur Nutzung von Lucene nicht viel dazu. Letztlich müssen Inhalte als Lucene-Dokumente indiziert werden. Anschließend können sie mit einer Suchabfrage gefunden werden.

Die Indizierung ist der aufwändigste Teil. Zunächst müssen Sie eine Entscheidung für ein Indizierungskonzept treffen. Powersearch indiziert beispielsweise anhand von Datenbankabfragen auf die TYPO3-Tabellen. Alle bekannten Ansätze der Indexed Search sind damit hinfällig. Die Autoren haben sich stattdessen für eine Indizierung anhand des Seiten­abrufs und des ausgelieferten HTML-Quelltexts ent­schieden, da sich dieser Ansatz der Indexed Search in vielen Projekten bewährt hat. Der wesentliche Vorteil ist, dass der Indexer sich nicht um die Herkunft der Daten kümmern muss – er nimmt alles, was über das Frontend erreicht werden kann und mit den bekannten Begin/End-Kommentaren markiert ist. Das kann auch Inhalt aus Plugins sein. Zusätzliche Attribute aus den Seiteneigenschaften können hierüber aber trotzdem verwendet werden.

Implementierung der Indizierung

Zum besseren Verständnis der nachfolgend beschriebenen Implementierung haben die Autoren die Extension „f4_lucene_workshop“ [7] erstellt. Diese enthält eine Indexer-Klasse sowie ein Plugin zur Verarbeitung und Anzeige von Suchanfragen.

Anzeige
Anzeige

Die Erstellung des Index für die Indexed Search übernimmt die Klasse „tx_indexedsearch_indexer“ in der Datei „class.indexer.php“. Die zwei wichtigsten Funktionen, die zur Indexerstellung für Lucene angepasst werden müssen, heißen „submitPage“ und „submitFilePage“. Die neue Indexer-Klasse „ux_tx_indexedsearch_indexer“ ist im Unterordner „xclass/“ zu finden und überschreibt diese beiden Funktionen. Anstatt die Daten nur in den Indexed-Search-Index zu schreiben, werden sie nun auch in den Lucene-Index geschrieben. Um die Zend-Lucene-Suche in den Extension-Klassen benutzen zu können, müssen Sie lediglich die entsprechende PHP-Datei mit Hilfe von „require_once ‚Zend/Search/Lucene.php‘;“ einbinden. Nun können Sie einen neuen Lucene-Suchindex erstellen.

PHP
$indexDir = '/typo3temp/lucene_search_index';
$index = Zend_Search_Lucene::create($indexDir);

Listing 1

Danach wird ein Lucene-Dokument erstellt und mit den Daten des Indexed-Search-Indexers gefüllt, bevor es in den Lucene-Index geschrieben wird:

PHP
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('title', $elements['title'], 'UTF-8'));
$index->addDocument($doc);

Listing 2

An dieser Stelle werden in der Implementierung natürlich weitere Attribute als Lucene-Felder ergänzt.

Anzeige
Anzeige

Index durchsuchen und aktualisieren

Nun können Sie die Indizierung testen. Öffnen Sie das TYPO3-Backend der Testseite, löschen Sie im Info-Modul den Index für eine Seite im Seitenbaum und danach den Frontend-Cache. Wichtig: Alle Inhaltselemente dieser Seite müssen „cacheable“ sein, da die Seite sonst nicht indiziert wird. Die Seite kann nun im Frontend neu geladen werden, da beim Caching auch die Indizierung angestoßen wird. Wenn Sie nun in das Dateisystem sehen, sollte sich im Verzeichnis „typo3temp“ ein neuer Unterordner „lucene_search_index“ befinden, in dem einige Dateien angelegt wurden.

Der beste Test, um zu prüfen, ob das Dokument tatsächlich im Index aufgenommen wurde, ist danach zu suchen. Für die Workshop-Extension wurde ein Suchformular angelegt, in das Sie einen Suchbegriff eingeben können. Nach dem Absenden des Formulars wird der Suchbegriff an die Zend-Lucene-Suche übermittelt. Die Suchfunktionalität ist in der Workshop-Extension in der Klasse „lucene_search_wrapper“ gekapselt. Im Konstruktor dieser Klasse wird zunächst der Lucene-Suchindex geöffnet.

PHP
$this->index = Zend_Search_Lucene::open($indexDirectory);

Listing 3

Der Suchbegriff wird nun an die Lucene-Suche übergeben, indem ein entsprechender Query formuliert wird.

Anzeige
Anzeige
PHP
$query = new Zend_Search_Lucene_Search_Query_Boolean();
$userQuery = Zend_Search_Lucene_Search_QueryParser::parse($searchTerm);
$query->addSubquery($userQuery, true);

Listing 4

Die Anfrage kann nun mittels „$hits = $index->find($query);“ an den Suchindex übergeben werden. In der Variable „$hits“ befinden sich nun die Suchergebnisse. Dabei handelt es sich um ein Array, das aus Objekten der Klasse „Zend_Search_Lucene_Search_QueryHit“ besteht. Über diese Objekte und deren Methode „getDocument()“ kann wiederum auf die jeweils hinterlegten Dokumente zugegriffen werden. Hierüber können die Daten aus den Feldern abgerufen werden, die im Index abgelegt wurden. In der Workshop-Extension wird nun über die einzelnen Treffer iteriert und die gespeicherten Angaben werden in einer Liste ausgegeben.

Um den Index einer Seite zu aktualisieren, muss das Dokument zunächst aus dem Index gelöscht und anschließend das aktualisierte Dokument in den Index geschrieben werden. Dazu wird eine eindeutige Suche nach dem entsprechenden Datensatz durchgeführt. In diesem Beispiel wurde der Einfachheit halber das Feld „ref“ als eindeutiger Identifikator benutzt. Das Feld „ref“ beinhaltet hier entweder die Seiten-UID oder den Dateinamen der indizierten Seite oder Datei. Für den produktiven Einsatz müssen hier auch die URL-Parameter einer Seite beziehungsweise die Ordnerhierarchie einer Datei gespeichert und wieder abgefragt werden, um etwa über „tt_news“-Seiten oder gleichnamige Dateien mit unterschiedlichen Inhalten suchen zu können. Mit folgendem Code wird bei der Indizierung getestet, ob bereits ein Dokument zur aktuellen Seite oder Datei vorhanden ist und dieses dann gelöscht.

PHP
$query = new Zend_Search_Lucene_Search_Query_Boolean();
$refIDTerm = new Zend_Search_Lucene_Index_Term($refId, 'ref');
$refIDQuery = new Zend_Search_Lucene_Search_Query_Term($refIDTerm);
$query->addSubquery($refIDQuery, true);
$hits = $index->find($query);
if(is_array($hits) && count($hits)>0)
	foreach($hits as $hit)
		$index->delete($hit->id);

Listing 5

Fazit

Gegenüber Indexed Search erzielt die hier beschriebene Lucene-basierte TYPO3-Suche im Lasttest eine deutlich höhere Geschwindigkeit. Der Aufwand für die grundsätzliche Einrichtung von Lucene als TYPO3-Suche ist dabei recht gering. Aufwändiger ist hingegen die Implementierung von speziellen Funktionen, etwa der Berücksichtigung von Benutzerberechtigungen, die Nutzung von „Boost Factors“ sowie erweiterten Suchfunktionen. Lucene bietet jedoch als Suchmaschine viel Potenzial und die Implementierungsaufgaben beziehen sich nicht auf die Entwicklung von optimierten Algorithmen zur Indizierung und Suche, sondern auf die Anwendungslogik. Das ist ein wesentlicher Unterschied, da hier keine Technologierisiken in der Entwicklung zu erwarten sind.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
3 Kommentare
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Tim Neugebauer

Die Nachteile bestehender Lösungen haben wir auch im Projektgeschäft festgestellt. Im Rahmen einiger größerer Entwicklungsprojekte haben wir ebenfalls Lucene im Rahmen des Zend Frameworks als TYPO3-Extension nutzbar gemacht, sowie diese so konzipiert, dass auch andere Such-Services implementiert werden können. An einer Solr-basierten Lösung wird im Rahmen eines aktuellen Kundenprojektes derzeit gearbeitet.

Für die bestehende Lösung existieren bereits Indexer für tt_content, tt_news und einige andere Content-Typen.

Weitere Informationen finden sich auf unserer Website.

Grüße,
Tim.

Antworten
Jpsy

In diesem Blogposting …
http://www.ibu.de/Comparison_of_Typo3_Search_Solutions
… kommt die Lucene-Lösung garnicht so gut weg. Es wird behauptet, dass der aufgeblähte Memory-Footprints von PHP+TYPO3+Java+Lucene zu Problemen führen kann. Besonders Maschinen mit viel (!) RAM seien gefährdet, da der Engpass laut Bericht in den Speicherbelegungstabellen im beschränkten LowMemory des Linux-Kernels entsteht („OOM-Killer“-Effekt).
Kann jemand das bestätigen oder wiederlegen? Über die im obigen Posting favorisierte Lösung (IB4Typo3) kann ich nichts aussagekräftiges finden und der Rest der Website scheint ziemlich tot zu sein.

Antworten
Jpsy

Nachtrag:
Ich denke, der topaktuelle t3n-Artikel über TYPO3 und Solr beantwortet meine obige Frage:
https://t3n.de/magazin/typo3-extension-apaches-solr-server-typo3-umgebung-nutzen-229610/
Das scheint mir der moderne Weg zum Einsatz von Lucene unter TYPO3 zu sein. Der Solr-Server läßt sich in Hochlast-Szenarien sicher auch gut auf eine eigene Maschine auslagern.

Antworten

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige