© Excellent backgrounds/Shutterstock.com
Elasticsearch und Java-Anwendungen

Wer sucht, der findet


Elasticsearch bietet die gesamte Funktionalität zur Nutzung als Document Store oder Suchserver über HTTP und JSON und ist damit aus vielen Programmierumgebungen heraus nutzbar. Beim Zugriff aus einer Java-Anwendung hat man weitere Vorteile – und die Wahl zwischen unterschiedlichen Mechanismen und Clients. Dieser Artikel stellt den Zugriff auf Elasticsearch über den Standardclient, über den REST-API-Client Jest und über Spring Data Elasticsearch vor.

Elasticsearch ist ein verteilter Document Store, mit dem über HTTP und JSON kommuniziert werden kann. Zahlreiche Funktionalitäten für die Volltextsuche auf Basis der bewährten Java-Bibliothek Apache Lucene stehen zur Verfügung. Ein neues Dokument, das im Beispiel einer Vortragsbeschreibung entspricht, kann wie in Listing 1 angegeben über den HTTP-Client curl hinzugefügt werden.

Listing 1

curl -XPUT "http://localhost:9200/conference/talk/1" -d' { "title" : "Anwendungsfälle für Elasticsearch", "speaker" : "Florian Hopf", "date" : "2014-07-17T15:35:00.000Z", "tags" : ["Java", "Lucene"], "conference" : { "name" : "Java Forum Stuttgart", "city" : "Stuttgart" } }'

Wir geben über den URL an, dass das Dokument im Index conference gespeichert werden soll und vom Typ talk ist. Der Index fasst logisch zusammengehörige Dokumente zusammen, der Typ beschreibt, welcher Entität ein Dokument entspricht.

Zur Konfiguration, wie auf einzelnen Feldern eines Dokuments gesucht werden kann, verwaltet Elasticsearch ein Mapping für jeden Typ. Dieses Mapping entspricht dem Schema der Daten und bestimmt, über welchen Analyzer der zugrunde liegende Text verarbeitet wird, also letztendlich, wie dieser durchsuchbar ist. Im Gegensatz zu vielen anderen Datenbanken kann bei der Arbeit mit Elasticsearch zu Beginn auf die explizite Angabe dieses Schemas verzichtet werden. Aus den Dokumenten, die in den Index geschrieben werden, wird automatisch die Struktur extrahiert, und die Speicherung erfolgt anhand sinnvoller Default-Werte. Meist ist es notwendig, diese Struktur später noch durch ein eigenes Mapping zu verfeinern. Es ermöglicht allerdings einen sehr einfachen Start mit Elasticsearch.

Dasselbe Dokument kann dann über einen einfachen GET-Request auf den URL oder über eine Suchanfrage ausgelesen werden. Suchanfragen werden meist mittels der Query DSL formuliert, einer JSON-Struktur zur Abbildung der Abfragen. Bei modernen Suchanwendungen beliebte Features wie Facettierung und Autovervollständigung können dabei direkt mit angefordert werden. Listing 2 zeigt ein Beispiel für eine Suchanfrage nach dem Begriff Elasticsearch im Feld Titel.

Listing 2

curl -XPOST "http://localhost:9200/conference/talk/_search" -d' { "query": { "match": { "title": "Elasticsearch" } } }'

Elasticsearch ist unter anderem deshalb populär geworden, weil auch große Datenmengen verwaltet werden können. Jeder Elasticsearch-Index kann aus mehreren Shards bestehen, die dann auf mehrere Maschinen verteilt werden können. Jeder Shard entspricht einem einzelnen Lucene-Index. So kann jeder Elasticsearch-Index ein Vielfaches der Daten von Lucene verwalten. Als so genanntes Replica kann jeder Shard noch als Kopie auf weiteren Knoten abgelegt werden. Dadurch erhöht sich die Verfügbarkeit der Daten, und der Durchsatz bei Suchanfragen kann deutlich gesteigert werden. Als Nutzer müssen wir nicht wissen, auf welchem Knoten unsere gewünschten Daten liegen. Wir können eine Anfrage an jeden Knoten im Cluster abschicken und werden mit den korrekten Ergebnissen versorgt.

Ein Discovery-Mechanismus ermöglicht die einfache Aufnahme von neuen Knoten in den Cluster. Per Default werden Elasticsearch-Instanzen, die denselben Clusternamen konfiguriert haben, erkannt und direkt in den Cluster aufgenommen. Elasticsearch kümmert sich dann automatisch darum, dass Shards und Replicas möglichst günstig auf die Knoten verteilt werden.

Wenn man auf Elasticsearch aus einer Java-Anwendung zugreifen möchte, hat man natürlich dank HTTP und JSON die Möglichkeit, den Zugriff selbst zu implementieren. Noch besser ist allerdings die Nutzung eines vorhandenen Clients oder einer Integration. Im Folgenden werden wir zeigen, wie wir den Standardclient, den REST-API-Client Jest und Spring Data Elasticsearch dafür nutzen können.

Der Standardclient

Die nahe liegende Wahl ist natürlich die Nutzung des von Elasticsearch direkt angebotenen Clients [1]. Das Besondere daran ist, dass dieser nicht als getrenntes JAR ausgeliefert wird, das nur die Clientfunktionalität enthält. Man integriert Elasticsearch als Ganzes in seine Anwendung, die dann als Knoten dem Elasticsearch-Clust...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang