© saicle/Shutterstock.com
Verteilte Echtzeitsuche und -analyse mit Elasticsearch

Verteilte Echtzeitsuche und -analyse mit Elasticsearch


Die verteilte Echtzeitsuch- und -analyse-Engine kann ohne Programmieranpassungen horizontal skaliert werden und unterstützt dabei High Availability mit automatischer Fehlerbehandlung bei Node-Ausfällen. Auch mehrere Indizes zu verwalten, stellt für Elasticsearch kein Problem dar. Die Kommunikation erfolgt über ein einfaches und sehr gut dokumentiertes RESTful-API. Die Liste der Features ist lang. Ein paar der wichtigsten werden wir in diesem Artikel präsentieren und weiterführende Informationsquellen nennen.

In fast jedem Bereich der Softwareentwicklung gibt es eine Vielzahl an unterschiedlichen Produkten. So ist es auch bei den Search-Engines der Fall. Eine große Zahl der Search-Engines, darunter auch Elasticsearch, wird unter einer Open-Source-Lizenz angeboten [1] und ist ohne große Investitionen in eigenen Produkten einsetzbar. Viele dieser Engines haben sich in unterschiedlichsten Einsatzszenarien bewährt. Zu diesen gehört zweifelsohne Elasticsearch [2].

Es baut wie einige andere Searchframeworks (Solr [3], Index Tank [4], Bobo Search [5] etc.) auf Apache Lucene auf. Ohne Erweiterungen unterstützt Elasticsearch die Aufteilung der Daten auf mehrere Shards, eine Art Datencontainer. In einem Set-up mit mehreren Instanzen von Elasticsearch (also mehreren Nodes), die zu einem Cluster zusammengefasst sind, können die Daten durch Sharding auf mehrere Nodes verteilt werden, was die Verwaltung sehr großer Datenmengen erst möglich macht. Gleichzeitig kann auch die Replikation verwendet werden. In diesem Fall werden die Shards auf einem oder mehreren Nodes dupliziert, was sich positiv auf die Geschwindigkeit und auch Ausfallsicherheit auswirkt. Mehrere Indizes können auch unter einem Alias zusammengefasst werden. Dadurch können auch neue Indizes im Produktivbetrieb hinzugefügt oder bestehende ersetzt werden, ohne die Geschwindigkeit oder die Stabilität der Suche negativ zu beeinflussen.

Wie jede ausgewachsene Search-Engine ist auch Elasticsearch sehr vielfältig einsetzbar. Es gibt bereits fertige Extensions für Onlineshops, CRM- und Content-Management-Systeme sowie gute Bibliotheken, um Elasticsearch in eigenen Webanwendungen zu integrieren. Da die Einbindung mit existierenden Extensions fast immer trivial ist, möchten wir uns in diesem Artikel auf eine generische Lösung unter Verwendung einer Bibliothek konzentrieren. Doch bevor wir Elasticsearch benutzen können, muss es zunächst installiert und eingerichtet werden.

Installation und Konfiguration

Als Grundlage für die Beschreibung der Installation benutzen wir Ubuntu 12.04. Da Elasticsearch auf Lucene aufbaut, wird die Java-Laufzeitumgebung vorausgesetzt. Wenn diese auf dem Server noch nicht installiert wurde, kann man dies mit sudo apt-get install openjdk-7-jre-headless -y nachholen.

Zum Zeitpunkt, als der Artikel geschrieben wurde, war Elasticsearch 0.90.5 die aktuellste Version. Es gibt schon ein fertiges Deb-Package dafür und es kann mit nur wenigen Befehlen heruntergeladen, installiert und als Service gestartet werden:

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.deb sudo dpkg -i elasticsearch-0.90.5.deb sudo service elasticsearch start

Mehr muss nicht gemacht werden. Wenn man jetzt im Browser die IP des Servers und Port 9200 aufruft (z. B. http://192.168.4.164:9200/), sollte die JSON-Response aus Listing 1 kommen oder eine ähnliche.

Listing 1

{ "ok" : true, "status" : 200, "name" : "Yondu", "version" : { "number" : "0.90.5", "build_hash" : "5c38d6076448b899d758f29443329571e2522410", "build_timestamp" : "2013-08-06T13:18:31Z", "build_snapshot" : false, "lucene_version" : "4.4" }, "tagline" : "You Know, for Search" }

Nach der Installation liegen die Konfigurationsdateien elasticsearch.yml und logging.yml im Verzeichnis /etc/elasticsearch/. Wie die Dateiendung schon sagt, wird die ganze Konfiguration im YAML-Format gespeichert, was eine schnelle und unkomplizierte Anpassung der Einstellungen ermöglicht. Man ist allerdings nicht nur auf YAML beschränkt. Wenn man die Konfiguration im JSON-Format vornehmen möchte, muss nur die Datei in elasticseach.json umbenannt werden – und schon werden alle Einstellungen als JSON interpretiert. Für uns müssen lediglich folgende Einstellungen in der Konfigurationsdatei eingetragen werden:

cluster: name: "cluster" node: name: "cluster-node"

Wenn wir elasticsearch mit sudo service elasticsearch restart neu starten und wieder http://192.168.4.164:9200/ aufrufen, sehen wir, dass sich der Name unseres Nodes von beispielsweise Yondu in cluster-node geändert hat.

Installation von Elasticsearch-Head

Manchmal möchte man den Search-Index sehen, ohne diesen programmatisch abfragen zu müssen, sei es denn, um sich einfach über den Status zu informieren oder schnell nachzuschauen, ob ein bestimmter Datensatz vorhanden ist. Dies und vieles mehr ist mit Elasticsearch-Head [6] möglich, einem Web-Frontend für Elasticsearch. Die Installation ist ebenfalls einfach und in ein paar Schritten erledigt. Man geht in das bin-Verzeichnis von Elasticsearch (bei der Standardinstallation ist dies unter /usr/share/elasticsearch/bin) und führt das Kommando plugin -install mobz/elasticsearch-head aus. Jetzt kann man Elasticsearch-Head unter http://192.168.4.164:9200/_plugin/head/ aufrufen (Abb. 1).

ryvlin_elasticsearch_1.tif_fmt1.jpgAbb. 1: Elasticsearch-Head im Browser

Installation von Elasticsearch-Tika-Plug-in

Oft reicht es nicht, nur Daten direkt aus Strings zu indexieren – eine gute Suche muss unter Umständen auch Ergebnisse anzeigen können, die aus Word-, PDF- und anderen Dateien stammen. Bei Apache Foundation wird für das Einlesen dieser Dokumente ein Projekt unter dem Namen Tika geführt. Mithilfe von Tika ist es möglich, über 1 000 verschiedene Dateiformate zu parsen und dabei sowohl die Metadaten als auch den strukturierten Textinhalt zu extrahieren und für die Suche zur Verfügung zu stellen.

Die Installation des Tika-Plug-ins für Elasticsearch ist sehr einfach. Im bin-Verzeichnis der Elasticsearch-Installation muss das Kommando plugin -install elasticsearch/elasticsearch-mapper-attachments/1.6.0 ausgeführt werden. Nach der Installation können dann bei den zu indexierenden Dokumenten einfach die Pfade zu den Dateien übergeben werden – den Rest erledigt Elasticsearch von alleine.

Für das Logging wird das in Elasticsearch bereits integrierte Apache-Projekt Log4j benutzt, dessen Standardkonfiguration in der Datei /etc/elasticsearch/logging.yml zu finden ist und bereits die wichtigsten Einstellungen beinhaltet. Nach diesen Schritten ist Elasticsearch installiert.

PHP-Libraries

Das API von Elasticsearch ist sehr mächtig. Außer dem Befül...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang