Volltextsuche mit Redis Stack (framework-doctrine-document)

Setup

Sie benötigen ein neues Docker image. Folgen Sie der Beschreibung unter document-storage.

Definition von Dokumenten und Inhalten

Das befüllen von Dokumenten findet automatisiert statt. Um Dokumente effizient erstellen zu können, ist eine Konfigurationsdatei je Package notwendig. Sie ermöglicht die Linearisierung hierarchischer Strukturen und Konfiguration von Redis. Hier ein Beispiel für Artikelgruppen und Artikel.

{ "repositories": [ { "repository": "shopGroup", "documents": [ { "type": "base", "placeholder": [ { "name": "label", "pattern": "{{ output=$1 }} / {{ output=$3 }}" }, { "name": "description", "pattern": "{{ output=$2 }}<br />{{ output=$4 }}" }, { "name": "image", "pattern": "{{ output=$5 }}", "isImage": true }, { "name": "keywords", "pattern": "{{ output=$3 }}" } ], "trigger": [ ["shopArticle", "shopGroup"], ["shopGroup"] ], "node": { "repository": "shopGroup", "properties": [ { "number": 1, "name": "shopGroupName" }, { "number": 2, "name": "shopGroupDescription" } ], "nodes": [ { "repository": "shopArticle", "properties": [ { "number": 3, "name": "shopArticleName" }, { "number": 4, "name": "shopArticleDescription" }, { "number": 5, "name": "shopArticleImage1" } ] } ] } } ] } ] }

nodes

Mit der Sektion Nodes wird die Quelldatenstruktur definiert. Hier definieren Sie die Repositories und deren Properties, deren Inhalte Sie im Dokument nutzen möchten. Beachten Sie dabei die tatsächliche Struktur der Datentypen. Mit dem Parameter number vergeben Sie einen eindeutigen Variablennamen.

placeholder

Die Placeholder werden genutzt, um die Zieldatenstruktur zu definieren. Die zuvor definierten Variablen können hier genutzt werden. Lesen Sie mehr unter Platzhalter.

Beachten Sie dass je Typ immer nur eine Struktur definiert werden kann. Die Inhalte der o.g. Felder (label, description, image, keywords) dürfen variieren, die Struktur muss jedoch für den Typ base in allen repository-search.json-Dateien identisch sein.

trigger

Trigger definieren die Repositories die indexieren von Dokumenten verursachen. Da sich aus der o.g. Definition ein linearisiertes und unstrukturiertes Dokument ergibt, wird ein Trigger benötigt. Man gibt den linearisierten Pfad der Struktur an. Alle Bestandteile der Struktur benötigen einen jeweils eigenen Trigger. Im Beispiel wird einer für die Artikelgruppen und einer für die Artikel benötigt.

type

Das ist der Dokumenttyp. Je Dokumenttyp dürfen viele Dokumente (mit unterschiedlichen Repositories) definiert werden. Der Dokumenttyp gibt die Struktur und den Nutzungszweck vor. Der Typ base wird in der globalen Suche in brandbox verwendet. 

Indexierung

Um Dokumente zu indexieren gibt es folgende zwei Möglichkeiten:

Indexierung zur Laufzeit

Wird keine weitere Konfiguration vorgenommen, wird Redis beim Verarbeiten von Datenätzen (bspw. speichern und löschen) aktualisiert. Die Aktion ist an die Doctrine-Events (onSave() und onDelete() geknüpft) 

Indexierung über einen Cronjob

In manchen Fällen ist der Aufbau von Dokumenten so komplex, dass es der Anwender zu lange auf die Serverantwort warten würde. Das hängt maßgeblich von der dahinterliegenden Anzahl Datensätze ab. Ergänzen Sie in dem Fall in der config.php den Parameter event-based:

'document-storage' => [ 'host' => getenv('DOCUMENT_STORAGE_HOST'), 'port' => getenv('DOCUMENT_STORAGE_PORT'), 'event-based' => false ]

Zusätzlich wird folgender Cronjob benötigt.

-package=Doctrine/DocumentStore -host=domain.brandbox.de

Rollen und Rechte

Rollen und Rechte bleiben bei der Indexierung unberücksichtigt. Bei der Suche wird jedoch anhand der Rollen gefiltert. Der Parameter $noAcl kann dafür verwendet werden.

Testing

Es steht ein Test zur Verfügung, den ausschließlich Administratoren ausführen können. Öffnen Sie dazu folgenden Request in Ihrem System:
/admin?request=Doctrine/DocumentStore.test&query=Auto