Sie befinden sich hier: start » faceted_search

TYPO3 Extension Faceted Search Installation und Konfiguration

TYPO3 Extension Faceted Search Installation und Konfiguration

Seit Jahren ist die TYPO3 Extension Faceted Search auf Webseiten der Agentur IBK im Betrieb. Die Facettierte Suche bietet mehrere Vorteile:

  • Im Gegensatz zur Indexed Search (Standard TYPO3 Core) lassen sich die Inhalte, in denen gesucht werden soll, direkt aus der Datenbank auslesen und es muss nicht die gesamte Webseite gecrawlt werden
  • Im Gegensatz zur SOLR Search muss kein eigener Webserver für die Indexierung mit Linux aufwändig aufgebaut werden und die Netzwerkverbindungen fallen weg

Die Installation und Einrichtung der TYPO3 Extension Faceted Search ist recht ausgiebig in der Dokumentation der Erweiterung beschrieben:

Frontend für Suchmaske und Ergebnisliste der Facettierten Suche

Eine der schönen Sachen bei TYPO3 ist, dass man eine Extension installieren und Monate an Arbeit sparen kann, um ein Projekt umzusetzen. Die Anpassung des Frontends auf der Webseite geschieht mit Hilfe von Fluid Templates, die man nicht in der Extension bearbeitet, sondern auf der eigenen Webseite am Besten in der eigenen Provider Extension.

TypoScript Setup für eigene Templates und Partials

In jedem Fall gibt man seinem TYPO3 System an, dass es HTML Vorlagen in einem von uns festgelegten Verzeichnis suchen soll. Diese haben einen höheren Stellenwert in der Hierarchie, den wir mit dem folgenden TypoScript Source Code festlegen:

plugin.tx_kesearch_pi1 {
  templateRootPath = EXT:extension/Resources/Private/Ke_search/Templates/
  templateRootPaths {
    10 = EXT:extension/Resources/Private/Ke_search/Templates/
	}
}

plugin.tx_kesearch_pi2 {
  view {
    partialRootPaths {
      10 = EXT:extension/Resources/Private/Ke_search/Partials/
    }
  }
}

Beachten Sie hierbei die beiden Interfaces pi1 und pi2 sowie die Tatsache, dass bei der Darstellung der Suchergebnisse die view angesprochen wird, im ersten Fall jedoch nicht. In den oben als Beispiel genannten Verzeichnissen können Sie nun die Dateien als Kopie ablegen, die Sie bearbeiten möchten. Bei der Facettierten Suche reicht bei den Templates im Allgemeinen die SearchForm.html, den Partials die ResultRow.html.

Eigener Indexer für die Facettierte Suche

Kommen wir nun zu einer Anwendung, die wir auf der TYPO3 Webseite der Agentur IBK finden. Folgendes Problem bestand: Der von Thomas Berscheid im Konzept einer Extension programmierte Blog der Agentur hatte fast 100 Beiträge, die nach mehreren Schritten zur SEO bei Google zu wichtigen Themen in der Suche angezeigt werden. Diese Beiträge sollten auch in der Suche auf der Webseite angezeigt werden können. Der Blog hatte zwar aus einer früheren Arbeitsversion der Extension eine eigene Suchfunktion, aber es wäre natürlich komfortabler für Besucher der Webseite, wenn sie alle Ergebnisse in einem Modul zur Verfügung hätten. Also haben wir als Vorbild für das Schreiben eines eigenen Indexers für die Facettierte Suche die Beispiel Extension heruntergeladen:

Auf Basis dieser Extension haben wir eine eigene Extension entwickelt und in unsere TYPO3 Webseite eingebunden. Die einzelnen Schritte dazu schildern wir Ihnen hier.

Controller des Indexers für eigene Extension

Sehen wir uns einmal die Funktionsweise der Faceted Search und des Indexers an. Wenn man eine Webseite fertig hat, die Facettierte Suche gerade neu eingebunden hat oder den Suchindex aktualisieren möchte, dann stößt man den Prozess der Indexierung an. Der Indexer der Faceted Search durchsucht dabei die Inhalte der TYPO3 Datenbank, also in erster Linie Überschriften und den Bodytext sowie die Zusammenfassung und weitere Inhalte zur Sprache, Datum etc. aus dem Projekt. Diese Inhalte werden dann in eine eigene Tabelle der Extension geschrieben, in der die Suche erfolgt. Ein eigener Indexer für die Facettierte Suche hat nun also die Aufgabe, eine neue Quelle zu durchsuchen und die Inhalte für

  • Überschrift
  • Inhalt
  • Kurzfassung

auszulesen, um sie dann in die Tabelle der Suche zu schreiben. Um dies zu ermöglichen, haben wir den Controller der Extension Faceted Search Hooks Example umgeschrieben und unsere eigenen Daten angeschlossen. Kern des Auslesens ist dabei die Funktion customIndexer. Dieser Funktion haben unsere Tabelle angegeben, in der die Inhalte unseres Blog stehen:

 if ($indexerConfig['type'] == BlogIndexer::KEY) {
  $table = 'tx_extblog_domain_model_blog'; 
  [...weiterer Source Code...] 
}

Zusätzlich setzt man als Konstante KEY ebenfalls den Namen der Tabelle, in der gesucht werden soll.

const KEY = 'tx_extblog_domain_model_blog';

SQL Statement für den Doctrine Datenbanktreiber

Für die Suche bauen wir nun das SQL Statement für den Doctrine Datenbanktreiber auf:

$statement = $queryBuilder 
  ->select('*')
  ->from($table)
  ->execute();

Nun durchläuft man die Abfrage über alle Datensätze und ordnet die abgefragten Felder, in diesem Fall ohne Einschränkung, den definierten Feldern der Indexer Tabelle zu:

while ($record = $statement->fetch()) {
  $title = strip_tags($record['blogtitle']);
  $abstract = strip_tags($record['blogabstract']);
  $content = strip_tags($record['blogcontent']);

Sie können den Datensätzen auch noch mehr Informationen über den Ursprung der indexierten Daten mitgeben:

$additionalFields = array(
  'orig_uid' => $record['uid'],
  'orig_pid' => $record['pid'],
  'sortdate' => $record['crdate'],
);

Composer.json bearbeiten

Je nachdem ob Sie für den Indexer eine eigene Extension erstellen oder die vorhandene Beispiel Erweiterung nutzen, müssen Sie die Datei composer.json im Stammverzeichnis der Extension anpassen, damit Sie über die Admin Tools im TYPO3 Backend oder den Composer einen Autoload für die Klassen Ihrer eingebundenen Extensions machen können. Ein Codebeispiel sieht so aus:

{
  "name": "ext/extsearch",
  "type": "typo3-cms-extension",
  "description": "Erweiterung der KE Search für Suche im Blog",
  "autoload": {
    "psr-4": {
      "Ext\\Extsearch\\": "Classes"
    }
  },
  "require": {
    "typo3/cms-core": "^9.5 || ^10.4",
    "teaminmedias-pluswerk/ke_search" : "^3.1.6"
  }
}

Nun können Sie die Extension in Ihre TYPO3 Webseite laden und nutzen. Eine Anbindung im Basis Template ist nicht notwendig. Die Konfiguration von Suche und Indexierung ist hier beschrieben:

Table Control Array (TCA) der Extension anpassen

Das Table Control Array müssen Sie ebenfalls anpassen:

Configuration – TCA - tx_kesearch_indexerconfig.php

$GLOBALS['TCA']['tx_kesearch_indexerconfig']['columns']['sysfolder']['displayCond'] .= ',' . \key\Extsearch\BlogIndexer::KEY;

Lokale Konfiguration anpassen

In der Datei ext_localconf.php im Stammverzeichnis Ihrer Extension müssen Sie ggf. die Pfade zu Ihrem Controller anpassen:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['registerIndexerConfiguration'][] =
  \Ext\Extsearch\BlogIndexer::class;
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['customIndexer'][] =
  \Ext\Extsearch\BlogIndexer::class;

// Register hooks for indexing additional fields.
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifyPageContentFields'][] =
  \Ext\Extsearch\AdditionalContentFields::class;
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifyContentFromContentElement'][] =
  \Ext\Extsearch\AdditionalContentFields::class;

// Register Hook to check if a content element should be indexed
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['contentElementShouldBeIndexed'][] =
  \Ext\Extsearch\AdditionalContentFields::class;

// Register Hook to add a custom autosuggest provider (ke_search_premium feature)
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search_premium']['modifyAutocompleWordList'][] =
  \Ext\Extsearch\AutosuggestProvider::class;