Wir stellen vor...
Welche Köpfe stecken hinter dem TUDOCK-Blog? Aus welcher Position heraus schreiben unsere Autoren? Und wer trägt was im Blog regelmäßig bei? Machen Sie sich ein Bild. »
Über neue Beiträge des Blogs und die Kommentare können Sie per RSS automatisch informiert bleiben.
Die Volltextsuchfunktion unter TYPO3 ist gerade für umfangreiche Unternehmenswebsites eine praktische Angelegenheit. Mit ihrer Hilfe lassen sich die im Content Management System abgelegten Inhalte nach den eingegebenen Begriffen schnell und einfach durchsuchen. Um diese Funktion anbieten zu können, erfasst TYPO3 alle auf den einzelnen Webseiten verwendeten Wörter in einer Datenbank, dem sogenannten Index. Gleichzeitig wird eine Verknüpfung zwischen den Wörtern im Index und allen Fundstellen erstellt und diese in einer weiteren Datenbank festgehalten, auf welche die Suchanfrage später zugreifen kann.
Leider kommt es bei der Indizierung von Inhalten manchmal zu Schwierigkeiten: Die TYPO3 Extension Indexed Search indiziert zwar komplette Webseiten, aber keine Dateien, externe oder ungecachte Seiten. Außerdem startet die Indizierung der Inhalte erst, wenn die entsprechende Seite von einem Nutzer im Frontend tatsächlich aufgerufen wird.
Abhilfe hierbei kann die Crawler-Extension liefern. Der Crawler erzeugt in einem ersten Schritt eine Liste mit abzuarbeitenden Jobs. In diesem Fall rufen die Jobs die Benutzerfunktionen der Indexed Search auf, welche wiederum für die Generierung eines Meta-Jobs sorgen, nämlich dass der Datensatz „Indexing Configuration“ ausgelesen und mit Hilfe der Funktion EXT:indexed_search/class.crawler.php:&tx_indexedsearch_crawler abgearbeitet werden soll. Im zweiten Schritt lässt der Crawler die gesamte Jobliste ausführen.
Die Erstellung der Jobliste durch den Crawler kann über TS-Config gesteuert werden. Das sieht beispielsweise so aus:
tx_crawler.crawlerCfg.paramSets {
language = &L=[|_TABLE:pages_language_overlay;_FIELD:sys_language_uid]
language.procInstrFilter = tx_indexedsearch_reindex, tx_cachemgm_recache
language.baseUrl = [domain/baseUrl]
}
# Indizierung für tt_news
tx_crawler.crawlerCfg.paramSets {
#Ordner mit den News-Datensätzen
tt_news = &tx_ttnews[tt_news]=[_TABLE:tt_news;_PID:43]
tt_news.procInstrFilter = tx_indexedsearch_reindex, tx_cachemgm_recache
tt_news.cHash = 1
#Seite auf der die Einzelansicht der News dargestellt wird
tt_news.pidsOnly = 44
tt_news.baseUrl = [baseUrl]
}
Wann und was indiziert werden soll, kann man auch anhand der Indexed Search zugehörigen Indexing Configuration bestimmen. Es lassen sich Startzeitpunkt und Intervall für die Indizierung eintragen, einzelne Elemente von der Indizierung ausnehmen oder „Database records“, „Filepath“, „Pagetree“ und „External URLs“ in die Indizierung einschließen.
Werden beide Konfigurationsvarianten parallel genutzt, ist Vorsicht geboten, da es hierbei zu doppelten Indizierungen kommen kann!
Die folgende Tabelle zeigt die Funktionsweisen und Einstellungsmöglichkeiten des Crawlers (TS-Config) und der Indexed Search (Indexing Configurations) im direkten Vergleich:
Aspekt | TS-Config | Indexing Configuration |
Verwaltung | TS-Config der Root-Seite | Datensätze |
Indizierungsart | + Komplette Seite wird indiziert | o Definierte Felder aus den Datensätzen werden indiziert |
Geschwindigkeit | - Langsam | +Schnell |
Re-Indexierung (Änderung des Datensatzes) | + Seite wird bei jedem Aufruf neu indiziert | + Eintrag wird neu indiziert, wenn es das Indizierungs-Intervall vorsieht |
Re-Indexierung (Ausblenden) | o Seite wird nicht aus dem Index genommen, aber mit dem Inhalt neu indiziert, den das Plugin für einen ausgeblendeten Datensatz ausgibt (z.B. „no news id“) | + Seite wird komplett aus dem Index genommen |
Re-Indexierung (Verschieben oder Löschen eines Datensatzes) | -- Seite wird nicht aus dem Index genommen und auch nicht neu indiziert | + Seite wird komplett aus dem Index genommen |
Sofortiges Indizieren nach Speichern | - nicht möglich | + möglich |
WHERE Bedingung | Mit Hack möglich | Mit Hack möglich. (VORSICHT: Indexed Search ist eine System Extension) |
Splitten der Suchergebnisse nach Nutzergruppen | + möglich | - nicht möglich |
Möchte man den Crawler aufrufen, bieten sich drei verschiedene Möglichkeiten:
1. Über das TYPO3-Backend (Modul Info > Bestimmte Seite > Site Crawler)
Mit „Start Crawling“ kann man Jobs erstellen, mit „Crawler Log“ kann man sich vorhandene Jobs anschauen und einzeln aufrufen und mit „CLI Status“ kann man das Indizieren starten.
2. Über die Shell
Beispiel: Erstellen einer Jobliste
root@tudock:~# /usr/bin/php /var/www/seminardaten/typo3/cli_dispatch.phpsh crawler_im 44 -d 99 -proc tx_indexedsearch_reindex -n 1000 -o queue
Beispiel: Jobliste abarbeiten
root@tudock:~# php /var/www/seminardaten/typo3/cli_dispatch.phpsh crawler
3. Per Cronjob
Hierfür sind zwei Cronjobs notwendig. Das sieht in der Crontab dann beispielsweise so aus:
# do the jobs on the list (every minute)
* * * * * /srv/www/htdocs/typo3/cli_dispatch.phpsh crawler
# build the joblist (every Friday at midnight)
0 0 * * 5 php /srv/www/htdocs/typo3/cli_dispatch.phpsh crawler_im 44 -d 99 -proc tx_indexedsearch_reindex -n 1000 -o queue
Die Parameter bedeuten dabei folgendes:
Verursacher für die doppelte Indexierung von News-Datensätzen scheint eine Einstellung in der Indexing Configuration zu sein. Hat man angegeben, dass die Datensätze direkt beim Speichern indiziert werden sollen, erfolgt keine Prüfung mehr, ob bereits ein Eintrag zu dieser URL existiert. Bei jedem Speichern wird so ein Eintrag erzeugt, der unabhängig von der „Queue“ ist. Besser ist es folglich, die Indizierungseinstellung für Datensätze in der Indexing Configuration wegzulassen und stattdessen über die TS-Config vorzunehmen.
Der direkte Vergleich zwischen den Konfigurationsmöglichkeiten mit TS-Config und der Indexing Configuration hat gezeigt, dass letztere bessere Optionen für die Re-Indexierung bietet. Möchte man die Probleme bezüglich des Indexierens verknüpfter Tabellen und der Reglementierung zu indexierender Datensätze umgehen, besteht die Möglichkeit, mit einem Hook neue Indexing Configuration-Typen hinzuzufügen. Als Beispiel hierfür sei die Indexierung von Seminaren (td_seminars) vorgestellt.
Zuerst legt man über den Extension Kickstarter eine leere Extension an und fügt die Dateien ext_tables.php und ext_localconf.php mit folgenden Inhalten hinzu:
ext_tables.php:
<?php
if (!defined ('TYPO3_MODE')) die ('Access denied.');
// TCA laden
t3lib_div::loadTCA('index_config');
// Neuen Typen hinzufügen:
$TCA['index_config']['columns']['type']['config']['items'][] = Array('Indiziere Seminare', 'tx_tdindexedsearchseminars');
// Welche Felder sollen angezeigt werden?
$TCA['index_config']['types']['tx_tdindexedsearchseminars'] = Array(
'showitem' => 'title;;1;;2-2-2, description, timer_next_indexing, timer_offset, timer_frequency, set_id, type;;;;3-3-3, alternative_source_pid, fieldlist, get_params, chashcalc,recordsbatch,records_indexonchange');
?>
ext_localconf.php
<?php
if (!defined ('TYPO3_MODE')) die ('Access denied.');
// Hook registrieren
$TYPO3_CONF_VARS['EXTCONF']['indexed_search']['crawler']['tx_tdindexedsearchseminars'] = 'EXT:td_indexedsearch_seminars/class.crawlerhook_seminars.php:&tx_indexedsearch_crawlerhook_seminars';
?>
So erhält man einen neuen Typen im Backend für die Indexing Configuration. Nun muss noch die eigentliche Programmlogik in der Klasse class.crawlerhook_seminars.php erstellt werden.
Für den Hook benötigt die Klasse zwei Funktionen, und zwar initMessage(), die den Titel für die Crawler-Queue zurückgibt, und die Funktion indexOperation($cfgRec,&$session_data,$params,&$pObj), die von der class.crawler.php aufgerufen wird. Hier erfolgt die Datensatzabfrage und Indizierung. Zum eigentlichen Indizieren kann die Funktion $pObj->indexSingleRecord($r,$cfgRec,$rl) aufgerufen werden. Als Vorlage dient die Funktion crawler_execute_type1($cfgRec,&$session_data,$params,&$pObj) aus der class.crawler.php, welche sehr ähnlich operiert. Einzig die SQL-Abfrage bedarf nun noch einer Änderung, um die Datensätze zu filtern und Verknüpfungsabfragen durchzuführen.
Ein weiterer Beispiel-Hook ist übrigens im Quellordner der Indexed Search zu finden.