Elasticsearch

Aus besserwiki.de
Elasticsearch
Elasticsearch logo.svg
Ursprüngliche(r) Autor(en)Shay Banon
Entwickler(n)Elastic NV
Erste Veröffentlichung8 Februar 2010; vor 13 Jahren
Stabile Version
6.x6.8.23 / 13 Januar 2022; vor 13 Monaten
7.x7.17.0 / 1 Februar 2022; vor 12 Monaten
Repositorygithub.com/elastic/elasticsearch
Geschrieben inJava
BetriebsystemPlattformübergreifend
TypSuche und Index
LizenzDoppellizenzierte Elastic-Lizenz (proprietär; Quellcode verfügbar) und Server Side Public License (proprietär; Quellcode verfügbar)
Shay Banon spricht über Elasticsearch auf der Berlin Buzzwords 2010

Elasticsearch ist eine Suchmaschine, die auf der Lucene-Bibliothek basiert. Sie bietet eine verteilte, mandantenfähige Volltextsuchmaschine mit einem HTTP-Webinterface und schemafreien JSON-Dokumenten. Elasticsearch wird in Java entwickelt und steht unter der quellverfügbaren Server Side Public License und der Elastic-Lizenz, während andere Teile unter die proprietäre (quellverfügbare) Elastic-Lizenz fallen. Offizielle Clients sind in Java, .NET (C#), PHP, Python, Apache Groovy, Ruby und vielen anderen Sprachen verfügbar. Laut dem DB-Engines-Ranking ist Elasticsearch die beliebteste Suchmaschine für Unternehmen.

Elasticsearch
Basisdaten
Entwickler Elastic
Erscheinungsjahr 2010
Betriebssystem plattformunabhängig
Programmiersprache Java
Kategorie Suchserver
www.elastic.co/elasticsearch
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. Er ermöglicht auf einfache Weise den Betrieb im Rechnerverbund zur Umsetzung von Hochverfügbarkeit und Lastverteilung.

Geschichte

Shay Banon schuf 2004 den Vorläufer von Elasticsearch, Compass genannt. Während er über die dritte Version von Compass nachdachte, erkannte er, dass es notwendig sein würde, große Teile von Compass neu zu schreiben, um "eine skalierbare Suchlösung zu schaffen". Also schuf er "eine von Grund auf verteilte Lösung" und verwendete eine gemeinsame Schnittstelle, JSON über HTTP, die auch für andere Programmiersprachen als Java geeignet ist. Shay Banon veröffentlichte die erste Version von Elasticsearch im Februar 2010.

Elastic NV wurde 2012 gegründet, um kommerzielle Dienstleistungen und Produkte rund um Elasticsearch und verwandte Software anzubieten. Im Juni 2014 gab das Unternehmen bekannt, dass es nur 18 Monate nach der Gründung in einer Serie-C-Finanzierungsrunde 70 Millionen US-Dollar eingeworben hat. Die Runde wurde von New Enterprise Associates (NEA) angeführt. Zu den weiteren Geldgebern gehören Benchmark Capital und Index Ventures. Mit dieser Runde stieg die Gesamtfinanzierung auf 104 Mio. $.

Im März 2015 änderte das Unternehmen Elasticsearch seinen Namen in Elastic.

Im Juni 2018 beantragte Elastic einen Börsengang mit einer geschätzten Bewertung zwischen 1,5 und 3 Milliarden Dollar. Am 5. Oktober 2018 wurde Elastic an der New York Stock Exchange notiert.

Geschichte der Veröffentlichungen

Wichtigste Veröffentlichungen:

  • 1.0.0 - 12. Februar 2014
  • 2.0.0 - 28. Oktober 2015
  • 5.0.0 - 26. Oktober 2016
  • 6.0.0 - November 14, 2017
  • 7.0.0 - 10. April 2019
  • 8.0.0 - 10. Februar 2022

Änderungen bei der Lizenzierung

Im Januar 2021 kündigte Elastic an, dass sie ab Version 7.11 ihren Apache 2.0 lizenzierten Code in Elasticsearch und Kibana neu lizenzieren würden, um eine Doppellizenz unter der Server Side Public License und der Elastic License zu erhalten, die beide nicht als Open-Source-Lizenz anerkannt sind. Elastic machte Amazon Web Services (AWS) für diese Änderung verantwortlich und beanstandete, dass AWS Elasticsearch und Kibana als Service direkt an Verbraucher anbietet und behauptete, dass AWS nicht angemessen mit Elastic zusammenarbeitet. Kritiker der Entscheidung zur Neulizenzierung sagten voraus, dass dies dem Ökosystem von Elastic schaden würde, und wiesen darauf hin, dass Elastic zuvor versprochen hatte, "die Lizenz des Apache 2.0-Codes von Elasticsearch, Kibana, Beats und Logstash niemals zu ändern". Amazon reagierte mit Plänen, die Projekte zu forken und die Entwicklung unter der Apache License 2.0 fortzusetzen. Andere Nutzer des ElasticSearch-Ökosystems, darunter Logz.io, CrateDB und Aiven, sprachen sich ebenfalls für eine Abspaltung aus, was zu einer Diskussion darüber führte, wie die Open-Source-Bemühungen koordiniert werden könnten. Aufgrund potenzieller Markenprobleme bei der Verwendung des Namens "Elasticsearch" benannte AWS seine Abspaltung im April 2021 in OpenSearch um.

Funktionen

Elasticsearch kann für die Suche in jeder Art von Dokument verwendet werden. Es bietet eine skalierbare Suche, eine Suche nahezu in Echtzeit und unterstützt Multitenancy. "Elasticsearch ist verteilt, was bedeutet, dass Indizes in Shards aufgeteilt werden können und jeder Shard kann null oder mehr Replikate haben. Jeder Knoten hostet einen oder mehrere Shards und fungiert als Koordinator, um Operationen an den/die richtigen Shard(s) zu delegieren. Rebalancing und Routing werden automatisch durchgeführt". Zusammenhängende Daten werden häufig im selben Index gespeichert, der aus einem oder mehreren primären Shards und null oder mehr Replikat-Shards besteht. Sobald ein Index erstellt wurde, kann die Anzahl der primären Shards nicht mehr geändert werden.

Elasticsearch wird zusammen mit der Datenerfassungs- und Log-Parsing-Engine Logstash, der Analyse- und Visualisierungsplattform Kibana und der Sammlung von leichtgewichtigen Datenversendern namens Beats entwickelt. Die vier Produkte sind für die Verwendung als integrierte Lösung konzipiert, die als Elastic Stack" bezeichnet wird. (Ehemals "ELK-Stack", kurz für "Elasticsearch, Logstash, Kibana").

Elasticsearch verwendet Lucene und versucht, alle seine Funktionen über die JSON- und Java-API verfügbar zu machen. Es unterstützt Facettierung und Perkolation (eine Form der prospektiven Suche), was nützlich sein kann, um zu benachrichtigen, wenn neue Dokumente zu registrierten Abfragen passen. Eine weitere Funktion, "Gateway", kümmert sich um die langfristige Persistenz des Indexes; beispielsweise kann ein Index im Falle eines Serverabsturzes vom Gateway wiederhergestellt werden. Elasticsearch unterstützt GET-Anfragen in Echtzeit und eignet sich daher als NoSQL-Datenspeicher, verfügt aber nicht über verteilte Transaktionen.

Am 20. Mai 2019 stellte Elastic die zentralen Sicherheitsfunktionen des Elastic Stack kostenlos zur Verfügung, darunter TLS für verschlüsselte Kommunikation, File- und Native Realm für die Erstellung und Verwaltung von Nutzern sowie rollenbasierte Zugriffskontrolle für die Steuerung des Nutzerzugriffs auf Cluster-APIs und Indizes. Der entsprechende Quellcode ist unter der "Elastic License", einer quelloffenen Lizenz, verfügbar. Darüber hinaus bietet Elasticsearch nun auch SIEM und Machine Learning als Teil der angebotenen Services an.

Verwaltete Dienste

Elastic Cloud ist eine Familie von Elasticsearch-basierten SaaS-Angeboten, die aus der Übernahme von Found durch Elastic im Jahr 2015 hervorgegangen sind und den Elasticsearch Service sowie den Elastic App Search Service und den Elastic Site Search Service umfassen, die aus der Übernahme von Swiftype durch Elastic hervorgegangen sind. Ende 2017 ging Elastic Partnerschaften mit Google ein, um Elastic Cloud in GCP anzubieten, und mit Alibaba, um Elasticsearch und Kibana in Alibaba Cloud anzubieten.

Elasticsearch Service on Elastic Cloud ist das offizielle gehostete und verwaltete Elasticsearch- und Kibana-Angebot der Macher des Projekts. Seit August 2018 können Nutzer von Elasticsearch Service sichere Bereitstellungen mit Partnern, Google Cloud Platform (GCP) und Alibaba Cloud erstellen.

AWS bietet Elasticsearch seit 2015 als Managed Service an. Solche verwalteten Dienste bieten Hosting, Bereitstellung, Backup und andere Unterstützung. Die meisten verwalteten Dienste umfassen auch Unterstützung für Kibana.

Funktionsweise

Dokumente, Typen und Indizes

Die kleinste Einheit, mit der gearbeitet wird, sind Dokumente (englisch documents). 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 (englisch mapping) 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:

{
  "titel": "Granatenstarke Suchmaschinentechnologie",
  "autor": "Michael Käfer",
  "erscheinungsjahr": "1794",
  "verlag": "Müller-Verlag"
} <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Dokumente, Typen und Indizes&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/Elasticsearch#Dokumente,_Typen_und_Indizes <span style="color:#dddddd">ⓘ</span>]</span>

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"
      }
   }
} <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Suchanfragen&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/Elasticsearch#Suchanfragen <span style="color:#dddddd">ⓘ</span>]</span>

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:

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

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ä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 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 werden auch die ursprünglich geschickten Originaldokumente an einem anderen Ort gespeichert.