Volltextsuche mittels Elasticsearch & PHP
Volltextsuche mittels Elasticsearch & PHP
Die Volltextsuche gehört zu jeder modernen Webseite dazu, egal ob Blog, Forum oder Online-Shop. Leider sind die Funktionen, die MySQL bzgl. Volltext-Index anbietet eher begrenzt und man kommt schnell an sein Limit. Der Funktionsumfang vom MySQL Fulltext-Index hat leider gewisse Eigenheiten, dass nach gewissen Wörtern nicht gesucht werden kann, die Sortierung der Ergebnisse ist meistens schlecht und es passiert schnell, dass Suchabfragen sehr langsam werden.
Möchte man eine wirklich gute Suche für seine Website haben, so kann ich Elasticsearch empfehlen.
Elasticsearch
Elasticsearch ist ein kostenfreier Suchmaschinen-Server. Ähnlich wie MySQL startet man den Server und kann diesem dann Dokumente hinzufügen. Was für Dokumente dies sind ist recht egal: Dies können Blogposts sein, Einträge in einem Forum, Produkte in einem Online-Shop.
Elasticsearch bietet dann umfangreiche Möglichkeiten diese Dokumente zu durchsuchen. Die Optionen für die Suche sprengen bei weitem den Rahmen von diesem Artikel, dort kann ich die sehr gute Dokumentation von Elasticsearch empfehlen.
Der große Vorteil von Elasticsearch gegenüber von MySQL ist:
- Elasticsearch ist sehr schnell. Selbst Millionen von Dokumenten können in wenigen Millisekunden durchsucht werden
- Umfangreiche Optionen der Suche: Das Suchen nach Wörtern, Wortkombinationen, Teilwörtern und Wortanfängen ist kein Problem. Ebenso kann man umfangreiche Filter einstellen, z.B. nur die Beiträge von einem bestimmten Benutzer durchsuchen, nur Produkte der Kategorie 'Technik' durchsuchen usw.
- Sortierung der Ergebnisse: Elasticsearch sortiert bereits die Ergebnisse nach Relevanz, d.h., es versucht die besten Treffer ganz oben in der Liste anzuzeigen. Dazu analysiert es sämtliche Dokumente im Index als auch die Sucheingabe.
Für mich ist Elasticsearch die erste Wahl, wenn es darum geht eine umfangreiche, gute und schnelle Suche in einer Anwendung anzubieten. Mit dieser Einschätzung bin ich nicht alleine: Wie in diesem Blogartikel aufgelistet, nutzen diverse große Unternehmen Elasticsearch, unter anderem auch Xing und Github. Auch für ein online Casino bonus ohne einzahlung sofort ließe sich ES super verwenden.
Elasticsearch-Server starten
Beim Shared Webhosting wird es leider schwierig einen Elasticsearch-Server zu betreiben, dies bietet fast kein Anbieter an. Hat man aber einen eigenen Server oder vServer, so lässt sich dort problemlos einen Elasticsearch-Server starten und betreiben. Auf diesen greift man in PHP mittels REST-API zu, d.h., es ist kein Problem wenn der Elasticsearch-Server auf einem anderen Server als euer Webserver / MySQL-Server betrieben wird.
Wie ihr Elasticsearch installiert und startet, findet ihr entsprechend in der Dokumentation. Ich gehe im weiteren davon aus, dass ihr einen ES-Server am laufen habt.
Ich persönlich nutze gerne Docker, um Elasticsearch zu starten. Wie das geht, findet ihr hier.
Ob der Elasticsearch-Server korrekt gestartet ist, könnt ihr durch den Aufruf von http://localhost:9200/ ermitteln. Das Ergebnis sollte wie folgt aussehen:
Elasticsearch mittels PHP ansteuern
Der Elasticsearch-Server wird mittels REST-API angesteuert, sprich, ganz normale HTTP-Aufrufe werden genutzt um Dokumente dem Server hinzuzufügen oder in diesen Dokumenten zu suchen.
Als nützliches Werkzeug kann ich elastic/elasticsearch-php empfehlen. Die Installation ist entsprechend einfach.
Dokumente mittels PHP indexieren
Der erste Schritt ist es, Dokumente mittels PHP zu indexieren. Das bedeutet, wir fügen unsere Text-Dokumente dem ES-Server hinzu, so dass dieser diese durchsuchen kann.
Ein minimales Beispiel für das Indexieren von Dokumente sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php use Elasticsearch\ClientBuilder; require 'vendor/autoload.php'; $client = ClientBuilder::create()->build(); $docs = ["Dies sind verschiedene Beispiel-Dokumente, die alle in ES indexiziert werden.", "Die Dokumente können kurz sein", "Oder sie können auch sehr lang sein und tausende von Wörtern enthalten.", "Dies stellt alles kein Problem für ES dar."]; for($i=0; $i < count($docs); $i++) { $params = [ 'index' => 'test_index', 'id' => $i, 'body' => ['text' => $docs[$i]] ]; $response = $client->index($params); print_r($response); echo "<br><br>"; } |
Ob das Indexieren funktioniert hat, können wir durch Aufruf dieser URL ermitteln: http://localhost:9200/test_index/_stats
Hier erkennen wir, dass 4 Dokumente sich im Index befinden.
Elasticsearch durchsuchen
Die Suche von ES können wir recht einfach durch den Aufruf der folgenden URL überprüfen: http://localhost:9200/test_index/_search?q=Dokumente
Hierbei durchsuchen wir den test_index mit dem Such-Query Dokumente. Als Antwort erhalten wir 2 Treffer, in denen das Wort Dokumente gefunden wurde.
In PHP können wir wie folgt Elasticsearch durchsuchen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php use Elasticsearch\ClientBuilder; require 'vendor/autoload.php'; $client = ClientBuilder::create()->build(); $params = [ 'index' => 'test_index', 'body' => [ 'query' => [ 'match' => [ 'text' => 'Dokumente' ] ] ] ]; $response = $client->search($params); echo "<pre>"; print_r($response); |
Weitere Informationen
Wie erwähnt ist Elasticsearch sehr mächtig und zu Beginn leider nicht immer einfach zu bedienen. Der Aufwand kann sich aber lohnen, da ihr mit ES eine sehr gute, umfangreiche und vor allem schnelle Suche erhaltet. Wenn die Suchfunktion in eurer Anwendung ein entscheidender Punkt ist, z.B. bei einem großen Online-Shop, lohnt sich der Aufwand auf alle Fälle.
Als umfassendes Tutorial zu Elasticsearch kann ich euch die Dokumentation empfehlen: Getting started with Elasticsearch
Autor: Nils Reimers