TYPO3-Erweiterungen: Der "Crawler" als Ergänzung der "Indexed Search"

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.

Konfigurationsmöglichkeiten

1. Crawler

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]

}

2. Indexing Configurations

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:

Vergleich

AspektTS-ConfigIndexing Configuration
VerwaltungTS-Config der Root-SeiteDatensätze
Indizierungsart+ Komplette Seite wird indizierto 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 BedingungMit Hack möglichMit Hack möglich
(VORSICHT: Indexed Search ist eine System Extension)
Splitten der Suchergebnisse nach Nutzergruppen+ möglich- nicht möglich

Aufruf des Crawlers

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:

  • crawler_im: Sorgt dafür, dass das Tool aufgerufen wird, das die Queue erstellt.
  • crawler: Sorgt dafür, dass gecrawled wird.
  • 44: Die Seiten-ID, ab der gecrawled werden soll.
  • -d 99: Die Rekursionstiefe.
  • -proc tx_indexedsearch_reindex: Es soll indiziert werden.
  • -n 1000: Wieviele Einträge pro Minute sollen erzeugt werden?
  • -o queue: Es soll die Queue erzeugt werden.
  • -o url: Es werden die URLs angezeigt.
  • -o exec: Erstellen der Jobs UND Abarbeiten der Jobs in einem Schritt.

Tipps zum Umgang mit dem Crawler

Das doppelte Indizieren von News-Datensätzen verhindern

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.

Einen Crawler Hook erstellen

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.

Nähere Informationen zur Crawler Extension findet man auch unter:

Autor: Kategorie: Content Management
Schlagwörter: CMS, Wissen
YTo2OntzOjY6ImZldXNlciI7aTowO3M6MzoicGlkIjtpOjk1O3M6MzoiY2lkIjtpOjEwOTUxMjQxO3M6NDoiY29uZiI7YToxMDp7czoxMDoic3RvcmFnZVBpZCI7aToxMjQ7czoxNDoiZXh0ZXJuYWxQcmVmaXgiO3M6MTE6InR4X25ld3NfcGkxIjtzOjEzOiJVc2VySW1hZ2VTaXplIjtpOjE4O3M6OToiYWR2YW5jZWQuIjthOjE6e3M6MjE6InNob3dDb3VudENvbW1lbnRWaWV3cyI7aTowO31zOjg6InNoYXJpbmcuIjthOjE6e3M6MTI6InVzZVNoYXJlSWNvbiI7Tjt9czo4OiJyYXRpbmdzLiI7YTozOntzOjE2OiJyYXRpbmdJbWFnZVdpZHRoIjtpOjExO3M6MTY6InJldmlld0ltYWdlV2lkdGgiO2k6MTY7czo4OiJtb2RlcGx1cyI7czo0OiJhdXRvIjt9czo2OiJ0aGVtZS4iO2E6Nzp7czoyNjoiYm94bW9kZWxUZXh0YXJlYUxpbmVIZWlnaHQiO2k6MzA7czoyNDoiYm94bW9kZWxUZXh0YXJlYU5ickxpbmVzIjtpOjQ7czoxNToiYm94bW9kZWxTcGFjaW5nIjtpOjEwO3M6MTg6ImJveG1vZGVsTGluZUhlaWdodCI7aToyMDtzOjE4OiJib3htb2RlbExhYmVsV2lkdGgiO2k6MTM0O3M6MjY6ImJveG1vZGVsTGFiZWxJbnB1dFByZXNlcnZlIjtpOjE7czoyMjoiYm94bW9kZWxJbnB1dEZpZWxkU2l6ZSI7aTozNTt9czoxNzoicHJlZml4VG9UYWJsZU1hcC4iO2E6MTA6e3M6MTQ6InR4X2FsYnVtM3hfcGkxIjtzOjE3OiJ0eF9hbGJ1bTN4X2ltYWdlcyI7czoxNToidHhfY29tbWVyY2VfcGkxIjtzOjIwOiJ0eF9jb21tZXJjZV9wcm9kdWN0cyI7czoxMjoidHhfaXJmYXFfcGkxIjtzOjEwOiJ0eF9pcmZhcV9xIjtzOjE1OiJ0eF9taW5pbmV3c19waTEiO3M6MTY6InR4X21pbmluZXdzX25ld3MiO3M6OToidHhfdHRuZXdzIjtzOjc6InR0X25ld3MiO3M6MTE6InR0X3Byb2R1Y3RzIjtzOjExOiJ0dF9wcm9kdWN0cyI7czoyNDoidHhfd2Vjc3RhZmZkaXJlY3RvcnlfcGkxIjtzOjI1OiJ0eF93ZWNzdGFmZmRpcmVjdG9yeV9pbmZvIjtzOjEyOiJ0eF9jb21tdW5pdHkiO3M6ODoiZmVfdXNlcnMiO3M6MTk6InR4X2N3dGNvbW11bml0eV9waTEiO3M6ODoiZmVfdXNlcnMiO3M6MTE6InR4X25ld3NfcGkxIjtzOjI1OiJ0eF9uZXdzX2RvbWFpbl9tb2RlbF9uZXdzIjt9czoxMToic2hvd1VpZE1hcC4iO2E6NTp7czo5OiJ0eF90dG5ld3MiO3M6NzoidHRfbmV3cyI7czoxMToidHRfcHJvZHVjdHMiO3M6NzoicHJvZHVjdCI7czoxMjoidHhfY29tbXVuaXR5IjtzOjQ6InVzZXIiO3M6MTk6InR4X2N3dGNvbW11bml0eV9waTEiO3M6MjU6ImFjdGlvbj1nZXR2aWV3cHJvZmlsZSZ1aWQiO3M6MTE6InR4X25ld3NfcGkxIjtzOjQ6Im5ld3MiO31zOjEyOiJSZXF1aXJlZE1hcmsiO3M6MToiKiI7fXM6NDoibGFuZyI7czoyOiJkZSI7czozOiJyZWYiO3M6Mjc6InR4X25ld3NfZG9tYWluX21vZGVsX25ld3NfMSI7fQ%3D%3DYTo0OntzOjQ6ImNvbmYiO2E6MzU6e3M6MTc6InVzZVdlYnBhZ2VQcmV2aWV3IjtzOjE6IjEiO3M6MjI6InVzZVdlYnBhZ2VWaWRlb1ByZXZpZXciO3M6MToiMSI7czoyMDoid2VicGFnZVByZXZpZXdIZWlnaHQiO3M6MjoiNzAiO3M6MjA6Im1heENoYXJzUHJldmlld1RpdGxlIjtzOjI6IjcwIjtzOjMxOiJ3ZWJwYWdlUHJldmlld0Rlc2NyaXB0aW9uTGVuZ3RoIjtzOjM6IjE2MCI7czozODoid2VicGFnZVByZXZpZXdEZXNjcmlwdGlvbk1pbmltYWxMZW5ndGgiO3M6MjoiNjAiO3M6Mjc6IndlYnBhZ2VQcmV2aWV3Q2FjaGVUaW1lUGFnZSI7czozOiIxODAiO3M6MzM6IndlYnBhZ2VQcmV2aWV3Q2FjaGVUaW1lVGVtcEltYWdlcyI7czoyOiI2MCI7czozMDoid2VicGFnZVByZXZpZXdDYWNoZUNsZWFyTWFudWFsIjtzOjE6IjAiO3M6Mjg6IndlYnBhZ2VQcmV2aWV3TnVtYmVyT2ZJbWFnZXMiO3M6MjoiMTAiO3M6Mzg6IndlYnBhZ2VQcmV2aWV3U2Nhbk1pbmltYWxJbWFnZUZpbGVTaXplIjtzOjQ6IjE1MDAiO3M6MzA6IndlYnBhZ2VQcmV2aWV3U2Nhbk1pbkltYWdlU2l6ZSI7czoyOiI0MCI7czozMDoid2VicGFnZVByZXZpZXdTY2FuTWF4SW1hZ2VTaXplIjtzOjM6IjQ1MCI7czoyOToid2VicGFnZVByZXZpZXdTY2FuTWluTG9nb1NpemUiO3M6MjoiMzAiO3M6MzE6IndlYnBhZ2VQcmV2aWV3U2Nhbk1heEltYWdlU2NhbnMiO3M6MjoiNDAiO3M6Mzg6IndlYnBhZ2VQcmV2aWV3U2Nhbk1heEltYWdlU2NhbnNGb3JMb2dvIjtzOjI6IjU1IjtzOjQwOiJ3ZWJwYWdlUHJldmlld1NjYW5NYXhIb3J6aXpvbnRhbFJlbGF0aW9uIjtzOjI6IjU7IjtzOjM3OiJ3ZWJwYWdlUHJldmlld1NjYW5tYXh2ZXJ0aWNhbHJlbGF0aW9uIjtzOjE6IjMiO3M6MzA6IndlYnBhZ2VQcmV2aWV3U2NhbkxvZ29QYXR0ZXJucyI7czoxMDoibG9nbyxjcmdodCI7czozODoid2VicGFnZVByZXZpZXdTY2FuRXhjbHVkZUltYWdlUGF0dGVybnMiO3M6NTc6InBpeGVsdHJhbnMsc3BhY2VyLHlvdXR1YmUscmNsb2dvcyx3aGl0ZSx0cmFuc3BhLGJnX3RlYXNlciI7czozODoid2VicGFnZVByZXZpZXdEZXNjcmlwdGlvblBvcnRpb25MZW5ndGgiO3M6MjoiNDAiO3M6MjU6IndlYnBhZ2VQcmV2aWV3Q3VybFRpbWVvdXQiO3M6NDoiNzAwMCI7czoxMjoidXNlUGljVXBsb2FkIjtzOjE6IjAiO3M6MTI6InVzZVBkZlVwbG9hZCI7czoxOiIwIjtzOjEzOiJwaWNVcGxvYWREaW1zIjtzOjM6IjEwMCI7czoxNjoicGljVXBsb2FkTWF4RGltWCI7czozOiI4MDAiO3M6MTY6InBpY1VwbG9hZE1heERpbVkiO3M6MzoiOTAwIjtzOjIyOiJwaWNVcGxvYWRNYXhEaW1XZWJwYWdlIjtzOjM6IjQ3MCI7czoyMzoicGljVXBsb2FkTWF4RGltWVdlYnBhZ2UiO3M6MzoiMzAwIjtzOjIwOiJwaWNVcGxvYWRNYXhmaWxlc2l6ZSI7czo0OiIyNTAwIjtzOjIwOiJwZGZVcGxvYWRNYXhmaWxlc2l6ZSI7czo0OiIzMDAwIjtzOjE4OiJzb3VuZGNsb3VkQ2xpZW50SUQiO3M6MDoiIjtzOjIyOiJzb3VuZGNsb3VkQ2xpZW50U2VjcmV0IjtzOjA6IiI7czoyMDoidXNlVG9wV2VicGFnZVByZXZpZXciO3M6MDoiIjtzOjI0OiJ0b3BXZWJwYWdlUHJldmlld1BpY3R1cmUiO2k6MDt9czoxMToiYXdhaXRnb29nbGUiO3M6Mjg6IldhcnRlIGF1ZiBBbnR3b3J0IHZvbiBHb29nbGUiO3M6ODoidHh0aW1hZ2UiO3M6MTM6IkJpbGQgZ2VmdW5kZW4iO3M6OToidHh0aW1hZ2VzIjtzOjE1OiJCaWxkZXIgZ2VmdW5kZW4iO30%3DYTowOnt9YTowOnt9YTo3OntzOjE2OiJjb21tZW50TGlzdEluZGV4IjthOjE6e3M6MzA6ImNpZHR4X25ld3NfZG9tYWluX21vZGVsX25ld3NfMSI7YToxOntzOjEwOiJzdGFydEluZGV4IjtpOjE1O319czoxNDoiY29tbWVudHNQYWdlSWQiO2k6OTU7czoxNjoiY29tbWVudExpc3RDb3VudCI7aToxMDk1MTI0MTtzOjEyOiJhY3RpdmVsYW5naWQiO2k6MDtzOjE3OiJjb21tZW50TGlzdFJlY29yZCI7czoyNzoidHhfbmV3c19kb21haW5fbW9kZWxfbmV3c18xIjtzOjEyOiJmaW5kYW5jaG9yb2siO3M6MToiMCI7czoxMjoibmV3Y29tbWVudGlkIjtOO30%3D YTo1OntzOjExOiJleHRlcm5hbFVpZCI7aToxO3M6MTI6InNob3dVaWRQYXJhbSI7czo0OiJuZXdzIjtzOjE2OiJmb3JlaWduVGFibGVOYW1lIjtzOjI1OiJ0eF9uZXdzX2RvbWFpbl9tb2RlbF9uZXdzIjtzOjU6IndoZXJlIjtzOjE2ODoiYXBwcm92ZWQ9MSBBTkQgZXh0ZXJuYWxfcmVmPSd0eF9uZXdzX2RvbWFpbl9tb2RlbF9uZXdzXzEnIEFORCBwaWQ9MTI0IEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuZGVsZXRlZD0wIEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuaGlkZGVuPTAgQU5EIHBhcmVudHVpZD0wIjtzOjEwOiJ3aGVyZV9kcGNrIjtzOjEzNzoiZXh0ZXJuYWxfcmVmPSd0eF9uZXdzX2RvbWFpbl9tb2RlbF9uZXdzXzEnIEFORCBwaWQ9MTI0IEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuZGVsZXRlZD0wIEFORCB0eF90b2N0b2NfY29tbWVudHNfY29tbWVudHMuaGlkZGVuPTAiO30%3D YToyOntpOjA7czoxNDk6IjxpbWcgc3JjPSIvdHlwbzNjb25mL2V4dC90b2N0b2NfY29tbWVudHMvcmVzL2Nzcy90aGVtZXMvdHVkb2NrL2ltZy9wcm9maWxlLnBuZyIgY2xhc3M9InR4LXRjLXVzZXJwaWMgdHgtdGMtdWltZ3NpemUiIHRpdGxlPSIiICBpZD0idHgtdGMtY3RzLWltZy0iIC8%2BIjtpOjk5OTk5O3M6MTUxOiI8aW1nIHNyYz0iL3R5cG8zY29uZi9leHQvdG9jdG9jX2NvbW1lbnRzL3Jlcy9jc3MvdGhlbWVzL3R1ZG9jay9pbWcvcHJvZmlsZWYucG5nIiBjbGFzcz0idHgtdGMtdXNlcnBpY2YgdHgtdGMtdWltZ3NpemUiIHRpdGxlPSIiICBpZD0idHgtdGMtY3RzLWltZy0iIC8%2BIjt9
Bitte bestätigen Sie
Nein
Ja
Information
Ok
Vorschau wird geladen ...
* Pflichtfeld
Ihr Kommentar ist eine Antwort auf den folgenden Kommentar

Wir behalten uns vor, Kommentare zu löschen, beispielsweise wenn sich diese nicht auf den Beitrag beziehen, zur Eigenwerbung missbraucht werden, persönliche Daten anderer enthalten, diskriminieren, beleidigen oder Rechte verletzen.

Datenschutzhinweis: Wenn Sie einen Kommentar oder sonstigen Beitrag in unserem Blog hinterlassen, speichern wir neben Ihren Angaben Ihre IP-Adresse. Darüber hinaus können Sie die Beiträge und Kommentare unseres Blogs abonnieren. Das Kommentarabonnement können Sie jederzeit abbestellen. Weitere Informationen finden Sie in unserer Datenschutzerklärung.

E-Commerce & Webentwicklung: Wir realisieren und optimieren Internetprojekte. Unser Fachgebiet sind Onlineshops, Rich Internet Applications und anspruchsvolle Onlineauftritte. Über unsere Arbeit schreiben wir. Hier im Blog von TUDOCK.