Über die Autoren

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. »

 RSS

Über neue Beiträge des Blogs und die Kommentare können Sie per RSS automatisch informiert bleiben.

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

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:

Felix Krüger - 17.12.200912:02 Uhr |  Permalink | Trackback setzen
Kategorien: TYPO3
Tags:  typo3 / extension

0 Kommentare

 Beitrag kommentieren

Ich möchte über jeden weiteren Kommentar in diesem Beitrag benachrichtigt werden.