Elasticsearch

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 14. Oktober 2016 um 15:50 Uhr durch 134.99.122.116 (Diskussion) (german typo). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Zur Navigation springen Zur Suche springen
Elasticsearch

Basisdaten

Entwickler Elastic
Erscheinungsjahr 2010
Aktuelle Version 2.3.1
(4. April 2016)
Betriebssystem plattformunabhängig
Programmiersprache Java
Kategorie Suchserver
Lizenz Apache-Lizenz
https://www.elastic.co/products/elasticsearch

Elasticsearch ist eine Suchmaschine auf Basis von Lucene. Das in Java geschriebene Programm speichert die Suchergebnisse in einem NoSQL-Format (JSON) und gibt sie über ein RESTful-Webinterface aus.

Elasticsearch-Konfiguration der Wikipedia-Server

Elasticsearch ist neben Solr der am weitesten verbreitete Suchserver[1]. Er ermöglicht auf einfache Weise den Betrieb im Rechnerverbund zur Umsetzung von Hochverfügbarkeit und Lastverteilung.[2]

Physischer Aufbau

Elasticsearch zerteilt jeden Index in mehrere Stücke, so genannte shards (Scherben, Bruchstücke). Die shards eines Indexes können vom Anwender bei Bedarf auf mehrere Server aufgeteilt werden, um die Rechenlast zu verteilen oder um Serverausfälle kompensieren zu können. Läuft Elasticsearch auf einem einzigen Server (node), bildet dieser alleine eine Gruppe (cluster). Läuft die Suchmaschine auf mehreren nodes, so wird einer als master node der Gruppe bestimmt.

Ein shard ist ein Lucene-Index, Elasticsearch nutzt Apache Lucene für die Indexierung und Suche als core library. Ein Elasticsearch-Index besteht also aus mehreren Lucene-Indices. Ein Lucene-Index besteht aus einem Ordner mit Dateien, die einen invertierten Index beinhalten.

Funktionsweise

Dokumente, Typen und Indexe

Die kleinste Einheit, mit der gearbeitet wird, sind Dokumente (englisch documents). Jedes Dokument, das durchsucht werden können soll, muss zuvor indiziert werden. Sollen beispielsweise Informationen zu Büchern durchsuchbar gemacht werden, könnte man die Informationen über jedes einzelne Buch in jeweils ein Dokument schreiben, welches anschließend indexiert werden muss. Mehrere Dokumente bilden zusammen einen Typ (type) und mehrere Typen einen Index (index). Ein Dokument entspricht dabei rudimentär einer Zeile einer SQL-Datenbank, ein Typ einer Tabelle und ein Index einer Datenbank. Jedes Dokument muss für die Indexierung einem Typ zugeordnet werden und jeder Typ bei seiner Erstellung einem Index.

Um indexiert werden zu können, müssen die Dokumente im JSON-Format an Elasticsearch gesendet werden. Als JSON-Dokumente bestehen sie jeweils aus einem Set an Paaren von Schlüsseln und Werten. Ein Beispiel für ein Dokument, welches ein Buch beschreiben soll:

{
   "titel": "Granatenstarke Suchmaschinentechnologie",
   "autor": "Michael Käfer",
   "erscheinungsjahr": "1794",
   "verlag": "Müller Verlag"
}

Suchanfragen

Auch die Suchanfragen (englisch queries) werden als JSON-Dokumente an Elasticsearch gesendet. Obiger Beispieldatensatz würde beispielsweise von folgender Suchanfrage gefunden werden:

{
   "query": {
      "match": {
         "titel": "suchmaschinentechnologie"
      }
   }
}

Der wichtigste Bestandteil einer Suchanfrage ist der Parameter query (sein Inhalt bestimmt, welche Dokumente in welcher Reihenfolge gefunden werden soll), weitere sind die Parameter size (bestimmt die maximale Anzahl an Treffern), from (dient der Aufteilung langer Trefferlisten auf mehrere Seiten), _source (ermöglicht es, nicht ganze Dokumente als Resultate zu erhalten, sondern nur bestimmte Felder dieser Dokumente) und sort (ermöglicht eine alternative, vom Benutzer definierbare Sortierung der Ergebnisse).

Einer Anfrage (query) können verschiedene Parameter zugeteilt werden. Einige Beispiele:

"match_all" : { }                   // findet alle Dokumente
"match" : {                         // findet alle Dokumente mit
   "titel" : "granatenstarke"       // "granatenstarke" im Feld "titel"
}                                   //
"multi_match" : {                   // findet alle Dokumente mit
   "query": "granatenstarke",       // "granatenstarke" im Feld "titel"
   "fields": ["titel","autor"]      // oder im Feld "autor"
}                                   //
"bool": {                           // 
   "must": {                        // im "titel"-Feld muss "quick"
      "match": {"titel": "quick"}   // vorkommen
   },                               //
   "must_not": {                    // im "titel"-Feld darf "lazy"
      "match": {"titel": "lazy"}    // nicht vorkommen
   },                               // 
   "should": {                      // im "titel"-Feld muss entweder
      "match": {"titel": "brown"},  // "brown" oder "green" vorkommen
      "match": {"titel": "green"}   //
   }                                //
}                                   //

Kommunikation mit der REST-API

Sowohl für die Indexierung der JSON-Dateien als auch für Suchanfragen wird mit der REST-API von Elasticsearch kommuniziert. Es gibt verschiedene Möglichkeiten, diese Kommunikation durchzuführen. Die am weitesten verbreitete und am besten dokumentierte ist, Dokumente und Suchanfragen mit Verwendung des Programms cURL an die REST-API zu senden. Weiter bieten sich verschiedene Programme an (etwa Postman), die benutzerfreundlich zu dieser Art der Kommunikation fähig sind, aber auch die Kommunikation über selbst erstellte Skripte in den gängigen Programmiersprachen. Ein Beispiel, in dem das obige JSON-Dokument mit cURL über ein Terminal an den Server gesendet wird, auf dem Elasticsearch läuft:

curl -X PUT '78.47.143.252:9200/materialienzusuchmaschinen/buecher/1?pretty' -d '{
   "titel": "Granatenstarke Suchmaschinentechnologie",
   "autor": "Michael Käfer",
   "erscheinungsjahr": "1794",
   "verlag": "Müller Verlag"
}'

Dem Index, in den das Dokument geladen wird, gibt man in diesem Beispiel den Namen „materialienzusuchmaschinen“, dem Typ den Namen „buecher“. Sind ein Index und ein Typ dieses Namens nicht ohnehin bereits vorhanden, so werden sie automatisch neu erstellt. Das gesendete Dokument wird unter der hier ebenfalls angegebenen ID „1“ abgelegt.

Indexierung

Schickt man ein Dokument zur Indexierung, startet Elasticsearch einen Analyseprozess (englisch analysis), währenddessen das Dokument für den Index aufbereitet wird. Dabei wird der zu indexierende Text des Dokuments umgewandelt, damit später die daraus gewonnenen Resultate in den Index geschrieben werden können. Zuerst wird der Text an definierten Stellen (wie Leerzeichen oder Kommas) in die einzelnen Wörter zerbrochen (etwa „Granatenstarke Suchmaschinentechnologie“ in „Granatenstarke“ und „Suchmaschinentechnologie“). Die Buchstaben jedes einzelnen dieser Wörter werden anschließend vollständig in Kleinbuchstaben umgewandelt (etwa „Granatenstarke“ in „granatenstarke“). Es folgen noch weitere Schritte; darüber hinaus ist es möglich, auch eigene Umwandlungsstufen einzubauen.

Zum einen speichert Elasticsearch die Resultate des Analyseprozesses (etwa „granatenstarke“) im Index ab, zum anderen auch die ursprünglich geschickten Originaldokumente an einem anderen Ort.

Literatur

  • Radu Gheorghe, Matthew Lee Hinman, Roy Russo: Elasticsearch in Action, Version 17, Manning, 2015, ISBN 9781617291623
  • Clinton Gormley, Zachary Tong: Elasticsearch. The definitive guide, 1. Aufl., O’Reilly, 2015, ISBN 978-1-4493-5854-9

Einzelnachweise

  1. DB-Engines Ranking of Search Engines, Stand April 2016
  2. Oliver B. Fischer: Volltextsuche mit ElasticSearch. In: heise Developer. 26. Juli 2013, abgerufen am 6. Juni 2015.