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:

 

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:

 

 

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:
Zurück zur Übersicht aller Beiträge