Typo3 Suche beschleunigen

Bei Typo3-Installationen mit mehr als 1000 Seiten wird die in Typo3 integrierte Suche sehr langsam. Das muss nicht zwangsläufig so sein.

In Typo3 bietet die System-Extension "Indexed Search (indexed_search)" eine Wortindex-basierte Suche. Der Index wird von einem Crawler-Dienst, der interne Dokumente des CMS aber auch verlinkte, externe Ressourcen berücksichtigen kann, in der unterliegenden SQL Datenbank aufgebaut. Zur Abfrage des Index wird um standardkonformes SQL verwendet.

Nun hat die Indexed Search-Extension bei größeren Seiten mit mehreren tausend Seiten Performanceprobleme. Darauf weist die Dokumentation sogar in den Known-Problems hin. Die Probleme liegen einerseits an (unnötig) komplizieren SQL-Abfragen. Andereseits erzeugt der Crawler sehr viele Daten, die die Datenbank-Tabellen (z.B. index_rel), etc schnell auf mehr als 1 Million Zeilen anwachsen lässt. Es lohnt sich dennoch nach pragmatischen Lösungen zu Suchen, da Alternativen wie externe Suchserver oder ein datenbankbasierter Volltextindex mehr Konfigurationsaufwand benötigen, oder in einer gegebenen Hosting-Umgebung nicht betrieben werden können.

Diese Komplexität der Index-Datenbank-Abfragen lässt sich sehr effektiv reduzieren, indem man Typo3 anweist nicht mehr nach Wortteilen (Volltext) zu suchen. Standardmäßig wird nämlich der LIKE-Operator zum Vergleich zwischen Suchbegriff und Index-Wort verwendet. Diese Änderung bedeutet natürlich eine Einschränkung, da nur noch eindeutige Übereinstimmungen mit dem Suchbegriff gefunden werden. Das ist in der Praxis jedoch meistens zu verschmerzen. Hierzu muss in der TypoScript-Konfiguration des indexed_search-Plugins folgende Einstellung vorgenommen werden:

plugin.tx_indexedsearch._DEFAULT_PI_VARS.type = 0

Der zweite Ansatzpunkt ist der Umfang des Suchindexes, d.h. welche Worte werden überhaupt vom Crawler berücksichtigt. In der Tabelle index_words werden alle vom Crawler gefundenen Wörter aufgezählt. In diese Tabelle gibt es eine Spalte is_stopword. Stopwords sind Wörter, die vor der maschinellen Verarbeitung von natürlichsprachlichem Text herausgefiltert werden. Diese Worte bieten für eine Suchmaschine keinerlei Verbesserung der Ergebnis-Qualität und können getrost vernachlässigt werden. Für eine Seite mit deutschem Inhalt setzt folgender SQL-Befehl das Stopword-Bit für irrelevante Begriffe:

update index_words as i set i.is_stopword = 1
where i.baseword in (
'aber','alle','allem','allen','aller','alles','als','also','am','an','ander','andere','anderem',
'anderen','anderer','anderes','anderm','andern','anderr','anders','auch','auf','aus',
'bei','bin','bis','bist','da','damit','dann','der','den','des','dem','die','das','daß','derselbe',
'derselben','denselben','desselben','demselben','dieselbe','dieselben','dasselbe',
'dazu','dein','deine','deinem','deinen','deiner','deines','denn','derer','dessen','dich',
'dir','du','dies','diese','diesem','diesen','dieser','dieses','doch','dort','durch','ein',
'eine','einem','einen','einer','eines','einig','einige','einigem','einigen','einiger',
'einiges','einmal','er','ihn','ihm','es','etwas','euer','eure','eurem','euren','eurer',
'eures','für','gegen','gewesen','hab','habe','haben','hat','hatte','hatten','hier',
'hin','hinter','ich','mich','mir','ihr','ihre','ihrem','ihren','ihrer','ihres','euch',
'im','in','indem','ins','ist','jede','jedem','jeden','jeder','jedes','jene','jenem',
'jenen','jener','jenes','jetzt','kann','kein','keine','keinem','keinen','keiner',
'keines','können','könnte','machen','man','manche','manchem','manchen',
'mancher','manches','mein','meine','meinem','meinen','meiner','meines',
'mit','muss','musste','nach','nicht','nichts','noch','nun','nur','ob','oder','ohne',
'sehr','sein','seine','seinem','seinen','seiner','seines','selbst','sich','sie','ihnen',
'sind','so','solche','solchem','solchen','solcher','solches','soll','sollte','sondern',
'sonst','über','um','und','uns','unse','unsem','unsen','unser','unses','unter','viel',
'vom','von','vor','während','war','waren','warst','was','weg','weil','weiter','welche',
'welchem','welchen','welcher','welches','wenn','werde','werden','wie','wieder','will',
'wir','wird','wirst','wo','wollen','wollte','würde','würden','zu','zum','zur','zwar',
'zwischen');

Die Einstellungen zu den Stopwords können auch über das Typo3-Backend vorgenommen werden. Einfach im Web ⇒ Info-Menü den Modus Indexed Search per Drop-Down-Box wählen. Anschließend öffnet sich eine Übersicht aller indizierten Unterseiten. Hier klickt man nun auf den Title der Seite. Anschließend wird eine Übersicht aller Such-Wörter, die mit der jeweiligen Seite verknüpft sind, gezeigt. Über den Button Change stop-word settings können einzelne Wörter von Hand als Stopword markiert werden.

2010-04-11_142620

Die Suche auf Ihrer Typo3-Seite sollte nun merklich schneller funktionieren. Falls Sie noch Fragen haben, oder Hilfe bei der Konfiguration Ihrer Typo3-Suche benötigen, kontaktieren Sie mich doch einfach unverbindlich unter joachim.rosskopf@lx-networking.de.