Was ist ein Elasticsearch Index?
Der Begriff Index ist in der Technik ziemlich überstrapaziert. Die meisten Entwickler würden auf die Frage, was ein Index ist, antworten, dass sich der Begriff häufig auf eine Datenstruktur in einer relationalen Datenbank (RDBMS) bezieht, die mit einer Tabelle assoziiert ist, die die Geschwindigkeit von Datenabrufen erhöht.
Was aber ist ein Elasticsearch® Index? Ein Elasticsearch Index ist ein logischer Namespace, der eine Ansammlung an Dokumenten beinhaltet, wobei jedes Dokument eine Ansammlung an Feldern ist – die wiederum Schlüssel-Wert-Paare sind, die Ihre Daten enthalten.
Wie unterscheidet sich ein Elasticsearch Index von einer relationalen Datenbank?
Elasticsearch Indizes sind anders als die in einer relationalen Datenbank. Stellen Sie sich einen Elasticsearch Cluster als Datenbank vor, die viele Indizes umfassen kann, die Sie sich als Tabelle vorstellen können. Jeder dieser Indizes umfasst viele Dokumente.
- RDBMS => Datenbanken => Tabellen => Zeilen/Spalten
- Elasticsearch => Cluster => Indizes => Shards => Dokumente mit Schlüssel-Wert-Paaren
Während Elasticsearch JSON-Dokumente speichert, sind Sie hinsichtlich Ihrer Eingabe in den Index ausgesprochen flexibel. Durch die Vielzahl an verfügbaren Integrationen und Beats ist die Einrichtung schnell erledigt. Sie können aber auch einen Schritt weitergehen und Ihre eigenen ETL-Prozesse mit Ingestierungspipelines oder Logstash® definieren; verwenden Sie dazu die zahlreichen Prozessoren und Plugins.
Ein weiterer Unterschied zu relationalen Datenbanken ist, dass Sie Daten hochladen können, ohne im Vorfeld ein Schema definieren zu müssen. Dynamische Typen sind eine tolle Möglichkeit, um schnell einzusteigen oder um mit unerwarteten Feldern in Dokumenten umzugehen. Sobald Sie alles eingerichtet haben, können Sie zu einem festen Schema wechseln, um die Leistung zu erhöhen.
Laufzeitfelder sind ein weiteres interessantes Feature, mit dem Sie „Schema-on-read“ oder „Schema-on-write“ verwenden können. Sie können zu einem bestehenden Dokument hinzugefügt und verwendet werden, um ein neues Feld abzuleiten. Sie können aber auch ein Laufzeitfeld bei der Abfrage erstellen. Sie können sie sich als berechnete Felder vorstellen, die Skripts verwenden, die in die Quelle des Dokuments lesen können.
Wollen Sie den Unterschied in Aktion sehen? Probieren Sie es heute noch aus – mit einem kostenlosen Probekonto auf Elastic Cloud.
Wie Daten mit der benutzerfreundlichen API von Elasticsearch interagieren
Elasticsearch bietet eine RESTful JSON-basierte API für die Interaktion mit Dokumentdaten. Sie können Dokumente indexieren, suchen, aktualisieren und löschen, indem Sie HTTP-Anfragen an die entsprechenden Cluster-Endpunkte senden. Diese CRUD-ähnlichen Vorgänge können auf Ebene einzelner Dokumente oder auf Ebene des Index selbst ablaufen. Wenn Sie dies bevorzugen, gibt es auch sprachspezifische Client-Bibliotheken, die Sie verwenden können, statt REST direkt zu nutzen.
Das folgende Beispiel erstellt ein Dokument in einem Index namens playwrights mit zugewiesener document_id 1. Wie Sie sehen, müssen wir keine Schemata oder Vorab-Konfigurationen erstellen; wir fügen einfach unsere Daten ein.
POST /playwrights/_doc/1
{
"firstname": "William",
"lastname": "Shakespeare"
}
Wir können nach Belieben weitere Dokumente und Felder hinzufügen. Mit einer relationalen Datenbank wäre das nicht ohne Weiteres möglich.
POST /playwrights/_doc/2
{
"firstname": "Samuel",
"lastname": "Beckett",
"year_of_birth": 1906
}
Nun können wir alle Dokumente mit dem Suchendpunkt abfragen.
GET /playwrights/_search
{
"query": {
"match_all": {}
}
}
Oder wir können eine Abfrage nach einem spezifischen Geburtsdatum starten.
GET /playwrights/_search
{
"query": {
“match": {
“year_of_birth": 1906
}
}
}
Zusätzlich zu grundlegenden Abfragen bietet Elasticsearch erweiterte Suchfunktionen wie Fuzzy Matching, Stemming, Relevanzscoring, Hervorhebungen und Tokenisierung, wobei Text in kleinere Teile heruntergebrochen wird, die Tokens genannt werden. In den meisten Fällen handelt es sich bei diesen Tokens um einzelne Wörter, aber es sind viele verschiedene Tokenizer verfügbar.
Warum sind denormalisierte Daten der Schlüssel zu schnellerem Datenabruf?
In relationalen Datenbanken wird Normalisierung häufig angewendet, um Datenredundanz zu eliminieren und Konsistenz zu gewährleisten. Beispielsweise können Kunden, Produkte und Aufträge in jeweils eigenen Tabellen enthalten sein.
In Elasticsearch ist Denormalisierung ein gängiger Vorgang. Statt Daten auf mehrere Tabellen zu verteilen, werden alle relevanten Informationen in einem einzelnen JSON-Dokument gespeichert. Ein Dokument für Aufträge enthielte also Kundeninformationen und Produktinformationen, statt im Auftragsdokument fremde Schlüssel zu speichern, die auf separate Indizes für Produkte und Kunden verweisen. So können in Elasticsearch Daten in Suchvorgängen schneller und effizienter abgerufen werden. Als allgemeine Daumenregel kann Speicherplatz günstiger sein als die Kosten für die Rechenleistung zum Zusammenführen von Daten.
Wie stellt Elasticsearch Skalierbarkeit in verteilten Systemen sicher?
Jeder Index wird mit einem eindeutigen Namen gekennzeichnet und in einen oder mehrere Shards aufgeteilt. Dabei handelt es sich um kleinere Untergruppen des Index, die eine parallele Verarbeitung und verteilte Speicherung über einen Cluster an Elasticsearch-Knoten ermöglichen. Shards haben ein primäres und ein Replikat-Shard. Replikate sind redundante Kopien Ihrer Daten zum Schutz vor Hardwareausfällen und erhöhen die Kapazität zur Auslieferung von Leseanfragen wie Suchen oder Dokumentenabrufen.
Wenn Sie dem Cluster weitere Knoten hinzufügen, erhalten Sie weitere Kapazitäten für Indexierung und Suche. Das ist mit einer relationalen Datenbank aufwendiger.
Wenn wir uns unser Beispiel playwrights von oben noch einmal ansehen, können wir die Typ-Mappings sehen, die Elasticsearch automatisch abgeleitet hat, sowie die Anzahl an Shards und Replikaten, die der Index zugewiesen hat.
GET /de/playwrights/
Welche Arten von Daten können in Elasticsearch indexiert werden?
Elasticsearch kann viele Arten von Daten indexieren – zunächst einmal Text, aber auch numerische Daten und Geopositionsdaten. Es kann auch dichte Vektoren speichern, die in Ähnlichkeitssuchen verwendet werden. Sehen wir uns diese nacheinander an.
Invertierte Indizes für Textsuche/lexikalische Suche
Elasticsearch wählt zudem die beste zugrunde liegende Datenstruktur für einen bestimmten Feldtyp aus. Beispielsweise wird Text tokenisiert und in einem invertierten Index gespeichert. Das ist eine Struktur, in der jedes eindeutige Token aufgeführt ist, das in einem beliebigen Dokument auftaucht, und das alle Dokumente angibt, in dem die jeweiligen Wörter vorkommen.
Folgende Tabelle zeigt den allgemeinen Aufbau eines invertierten Index. Wir können sehen, dass eine Suche nach „London“ ergibt, dass der Begriff in sechs unterschiedlichen Dokumenten im Index vorkommt. Ein solcher invertierter Index ermöglicht es uns, textbasierte Abfragen sehr schnell auszuführen.
Token | Dokumenten-IDs |
London | 1,3,8,12,23,88 |
Paris | 1,12,88 |
Madrid | 3,8,12 |
Berlin | 12,23 |
Suche nach numerischen Daten und Geopositionsdaten für effiziente räumliche Analyse
Numerische Daten und Geopositionsdaten werden in BKD-Bäumen gespeichert, die auch als „Block-KD-Baum-Index“ bezeichnet werden. Es handelt sich um eine Datenstruktur, die in Anwendungen im Ingenieurswesen für effiziente räumliche Indexierung und Abfrage multidimensionaler Daten verwendet wird. Sie organisiert Datenpunkte in Blöcken und ermöglicht schnelle Bereichssuchen und Nearest-Neighbor-Abfragen in großen Datensätzen. Somit ist es ein wertvolles Tool für Ingenieure, die sich mit der Analyse und Optimierung räumlicher Daten auseinandersetzen.
Vektorsuche/Semantische Suche mit NLP
Von Vektorsuche haben Sie vielleicht gehört, aber was genau ist das? Vektorsuchmaschinen – auch bekannt als Vektordatenbanken, semantische oder Kosinus-Suche – suchen den nächsten Nachbarn für eine bestimmte (vektorisierte) Abfrage. Die Vektorsuche ist deshalb leistungsstark, weil sie ähnliche Dokumente findet, bei denen keine exakte Textübereinstimmung besteht, wie sie im obigen Beispiel mit dem invertierten Index erforderlich wäre. Stattdessen verwendet sie Vektoren, die ein bestimmtes Ähnlichkeitsniveau beschreiben.
Die Computerlinguistik (CL) hat mit der sogenannten Texteinbettung ein Verfahren entwickelt, das Wörter und Sätze als numerische Vektoren codiert. Diese Vektordarstellungen erfassen den linguistischen Inhalt des Textes und können dann dazu verwendet werden, die Ähnlichkeit zwischen einer Abfrage und einem Dokument zu bewerten.
Einige gängige Anwendungsfälle für die Vektorsuche sind:
- Beantwortung von Fragen
- Antworten auf zuvor beantwortete Fragen in Textform finden, bei denen die gestellte Frage ähnlich, aber nicht exakt dieselbe ist
- Empfehlungen – beispielsweise eine Musikanwendung, die ähnliche Stücke basierend auf Ihren Vorlieben sucht
Alle diese Anwendungsfälle nutzen Vektoren mit zehntausenden Dimensionen, die eine umfassende Repräsentation der Daten für eine genaue Ähnlichkeitsbeurteilung und zielgerichtete Empfehlungen bieten.
Elasticsearch unterstützt Vektorsuche über den Dokumententyp dense_vector und seine Fähigkeit zur Durchführung von Ähnlichkeitssuchen zwischen dem Vektor in dem Dokument und dem Suchbegriff, nachdem er in einen Vektor konvertiert wurde.
Für diejenigen, die etwas tiefer in die generative KI eintauchen möchten, bieten wir auch ESRE, die Elasticsearch Relevance Engine™, die als Basis für Suchanwendungen auf Grundlage künstlicher Intelligenz dient. Mit ESRE erhalten Entwickler eine vollständige Suite aus komplexen Abrufalgorithmen und Integrationsmöglichkeiten mit Large Language Models.
Probieren Sie es aus!
Wie Sie sehen, haben sich Elasticsearch Indizes enorm weiterentwickelt, seit Shay Banon, Mitbegründer und Chief Technology Officer von Elastic, eine Rezeptsuchmaschine für seine Frau schrieb. Es gibt noch viel mehr zu entdecken. Ein Probekonto auf Elastic Cloud bietet den idealen Einstieg – in wenigen Minuten können Sie loslegen. Sehen Sie sich auch das Webinar Erste Schritte mit Elasticsearch an.
Englische Originalversion ursprünglich am 24. Februar 2013 veröffentlicht; am 17. Juli 2023 aktualisiert.