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