Zum Inhalt springen

Elasticsearch

aus Wikipedia, der freien Enzyklopädie
Elasticsearch

[[Datei:Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)|150px]]
Basisdaten

Maintainer Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Entwickler Elastic
Erscheinungsjahr 2010
Aktuelle Version Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value))
Aktuelle Vorabversion Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value))
Betriebssystem plattformunabhängig
Programmier­sprache Java
Kategorie Suchserver
Lizenz Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
www.elastic.co/elasticsearch
Datei:Elasticsearch Cluster August 2014.png
Elasticsearch-Konfiguration der Wikipedia-Server

Elasticsearch ist eine Suchmaschine auf Basis von Lucene. Das in Java geschriebene Programm speichert Dokumente in einem NoSQL-Format (JSON). Die Kommunikation mit Klienten erfolgt über ein RESTful-Webinterface. Elasticsearch ist neben Solr der am weitesten verbreitete Suchserver.<ref>DB-Engines Ranking of Search Engines, Stand April 2016</ref> Er ermöglicht auf einfache Weise den Betrieb im Rechnerverbund zur Umsetzung von Hochverfügbarkeit und Lastverteilung.<ref>Oliver B. Fischer: Volltextsuche mit ElasticSearch. In: heise Developer. 26. Juli 2013, abgerufen am 6. Juni 2015.</ref>

Lizenzierung[Bearbeiten]

Elasticsearch und Kibana unterliegen der kostenlosen Server Side Public License. Für Cloudangebote hingegen ist die kostenpflichtige Elastic License notwendig.

Das Unternehmen Elastic NV hatte 2018 die Lizenzierung unter Open-Source-Lizenz auf Lebenszeit versprochen,<ref>We Opened X-Pack. Elasticsearch B.V., 2018, archiviert vom Vorlage:IconExternal am 31. Juli 2019; abgerufen am 22. August 2022 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> es folgte dem „Open Core“-Model, das heißt, der Kern der Software unterlag Open-Source-Lizenzen (hauptsächlich Apache License 2.0), andere Teile standen unter der kommerziellen Elastic License.<ref>Open Source, Distributed, RESTful Search Engine. Contribute to elastic/elasticsearch development by creating an account on GitHub. elastic, 14. März 2019, abgerufen am 14. März 2019.</ref>

Entgegen der Ankündigung von 2018 wurden mit der 2021 veröffentlichten Version 7.11 die Open-Source-Lizenzen durch die Server Side Public License ersetzt, die keine Open-Source-Lizenz ist, weil sie keine Cloudangebote erlaubt. Elastic machte Amazon Web Services für diese Änderung verantwortlich und beanstandete deren Verwendung von Elasticsearch in der Vergangenheit.<ref>Elastic: Amazon: NOT OK - why we had to change Elastic licensing. In: elastic.co. 19. Januar 2021, abgerufen am 21. Januar 2021.</ref><ref>Elastic: Amazon ist schuld am Open-Source-Ende. In: heise online. 20. Januar 2021, abgerufen am 21. Januar 2021.</ref>

OpenSearch (Abspaltung)[Bearbeiten]

2021 veröffentlichten AWS, Logz.io, Red Hat, SAP und Capital One eine Abspaltung unter dem Namen OpenSearch, die das Projekt unter der Apache-2.0-Lizenz fortführen.<ref>OpenSearch gegen Elasticsearch: Amazons Fork-Klatsche. In: heise online. 13. April 2021, abgerufen am 14. April 2021.</ref><ref>OpenSearch auf GitHub</ref>

Elastic hat daraufhin die Elasticsearch-Clients so geändert, dass sie Verbindungen mit OpenSearch-Servern verweigern und nur noch Elasticsearch-Server erlauben.<ref>Elastic Hits Back at OpenSearch, Making Client Libraries Incompatible with Amazon-led Open Source Fork. 11. August 2021, abgerufen am 22. August 2022 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> Dagegen funktionieren die OpenSearch-Clients sowohl mit OpenSearch- als auch mit Elasticsearch-Servern.<ref>Keeping clients of OpenSearch and Elasticsearch compatible with open source. 4. August 2021, abgerufen am 22. August 2022 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>

Physischer Aufbau[Bearbeiten]

Elasticsearch zerteilt jeden Index in mehrere Stücke, so genannte {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (Scherben, Bruchstücke). Die {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) eines Indexes können vom Anwender bei Bedarf auf mehrere Server ({{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)) aufgeteilt werden (die Gruppe heißt {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)), um die Rechenlast zu verteilen oder um Serverausfälle zu kompensieren. Läuft die Suchmaschine auf mehreren {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value), so wird einer als {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) der Gruppe bestimmt.

Ein {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) 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-Indizes. Ein Lucene-Index besteht aus einem Ordner mit Dateien, die einen invertierten Index beinhalten.

Funktionsweise[Bearbeiten]

Dokumente, Typen und Indizes[Bearbeiten]

Die kleinste Einheit, mit der gearbeitet wird, sind Dokumente ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value)). Jedes Dokument, das durchsucht werden soll, muss zuvor indiziert werden. Sollen beispielsweise Informationen zu Büchern durchsuchbar gemacht werden, könnten die Informationen über jedes einzelne Buch in jeweils ein Dokument geschrieben werden, welches anschließend indexiert werden muss. Ein Index entspricht dabei in etwa einer SQL-Tabelle, ein Dokument einer Zeile dieser Tabelle. Jedoch sind die Anzahl und Typen der Felder nicht notwendigerweise starr vorgegeben, können aber bei Bedarf durch eine Typzuweisung ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value)) explizit typisiert werden.

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

<syntaxhighlight lang="json"> {

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

} </syntaxhighlight>

Suchanfragen[Bearbeiten]

Auch die Suchanfragen ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value)) werden als JSON-Dokumente an Elasticsearch gesendet. Obiger Beispieldatensatz würde beispielsweise von folgender Suchanfrage gefunden werden:

<syntaxhighlight lang="json"> {

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

} </syntaxhighlight>

Der wichtigste Bestandteil einer Suchanfrage ist der Parameter query (sein Inhalt bestimmt, welche Dokumente in welcher Reihenfolge gefunden werden sollen), 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:

<syntaxhighlight lang="json">

"match_all": { } </syntaxhighlight>

  • findet alle Dokumente
<syntaxhighlight lang="json">

"match": {

  "titel": "granatenstarke"

} </syntaxhighlight>

  • findet alle Dokumente mit "granatenstarke" im Feld "titel"
<syntaxhighlight lang="json">

"multi_match": {

  "query": "granatenstarke",
  "_source": ["titel","autor"]

} </syntaxhighlight>

  • findet alle Dokumente mit "granatenstarke" im Feld "titel" oder im Feld "autor"
<syntaxhighlight lang="json">

"bool": {

  "must": {
     "match": {"titel": "quick"}
  },
  "must_not": {
     "match": {"titel": "lazy"}
  },
  "should": {
     "match": {"titel": "brown"},
     "match": {"titel": "green"}
  }

} </syntaxhighlight>

  • im "titel"-Feld muss "quick" vorkommen
  • im "titel"-Feld darf "lazy" nicht vorkommen
  • im "titel"-Feld sollte idealerweise "brown" oder "green" vorkommen

Kommunikation mit der REST-API[Bearbeiten]

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[Bearbeiten]

Schickt man ein Dokument zur Indexierung, startet Elasticsearch einen Analyseprozess ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value)), während 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 zerlegt (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, eigene Umwandlungsstufen einzubauen.

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

Literatur[Bearbeiten]

  • Radu Gheorghe, Matthew Lee Hinman, Roy Russo: Elasticsearch in Action, Version 17. Manning, 2015, ISBN 978-1-61729-162-3
  • Clinton Gormley, Zachary Tong: Elasticsearch. The definitive guide. 1. Auflage. O’Reilly, 2015, ISBN 978-1-4493-5854-9
  • Madhusudhan Konda: Elasticsearch in Action, Second Edition, Manning, 2023, ISBN 978-1-6172-9985-8

Einzelnachweise[Bearbeiten]

<references />

Vorlage:Hinweisbaustein