Als Entwickler stehen wir heute vor der Herausforderung, immer größere Datenmengen nicht nur zu speichern, sondern auch effizient durchsuchbar zu machen. Stellen Sie sich vor, Sie entwickeln eine E-Commerce-Plattform mit Millionen von Produkten. Kunden erwarten sofortige, relevante Suchergebnisse, auch wenn sie Tippfehler machen oder Produktbeschreibungen nur teilweise kennen. Genau für solche Anforderungen wurde OpenSearch entwickelt.

Um zu verstehen, warum OpenSearch so wertvoll ist, lassen Sie uns zunächst betrachten, warum traditionelle relationale Datenbanken bei bestimmten Aufgaben an ihre Grenzen stoßen. Nehmen wir ein konkretes Beispiel:
In einer relationalen Datenbank würden Sie Produktdaten vielleicht so strukturieren:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
price DECIMAL(10,2),
category_id INT
);
CREATE TABLE product_attributes (
product_id INT,
attribute_name VARCHAR(50),
attribute_value VARCHAR(100)
);
CREATE TABLE product_categories (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT
);Wenn ein Kunde nun nach “wasserdichte kamera unter 300 euro” sucht, müssten Sie komplexe SQL-Queries mit LIKE-Operatoren und Joins schreiben. Die Performance wäre suboptimal, und die Ergebnisse wären nicht nach Relevanz sortiert.
In OpenSearch können wir dieselben Daten natürlicher modellieren:
{
"id": "P12345",
"name": "Wasserdichte Digitalkamera XC-100",
"description": "Kompakte, robuste Kamera für Outdoor-Aktivitäten",
"price": 299.99,
"category": {
"name": "Kameras",
"path": ["Elektronik", "Foto & Video", "Kameras"]
},
"attributes": {
"wasserdicht": true,
"maxTiefe": "10m",
"auflösung": "20MP",
"akkulaufzeit": "4h"
},
"tags": ["outdoor", "wasserdicht", "kompakt"]
}
Diese dokumentenorientierte Struktur bietet mehrere Vorteile:
Das Konzept hinter der Suchgeschwindigkeit von OpenSearch ist der invertierte Index. Stellen Sie sich einen klassischen Buchindex vor, der für jedes wichtige Wort die Seitenzahlen auflistet. OpenSearch verwendet ein ähnliches, aber deutlich fortgeschritteneres Prinzip.

Nehmen wir drei Produktbeschreibungen:
OpenSearch erstellt daraus intern eine Struktur wie diese:
wasserdicht → Dokument 1, Dokument 3
digital → Dokument 1, Dokument 2
kamera → Dokument 1, Dokument 2, Dokument 3
outdoor → Dokument 1
professionell → Dokument 2
wlan → Dokument 2
smartphone → Dokument 3
Wenn jemand nach “wasserdichte kamera” sucht, kann OpenSearch sofort die Dokumente 1 und 3 als potenzielle Treffer identifizieren, da nur sie beide Suchbegriffe enthalten. Zusätzlich kann OpenSearch die Ergebnisse nach Relevanz sortieren, etwa basierend darauf, wie oft die Suchbegriffe vorkommen oder wie nah sie beieinander stehen.
OpenSearch wurde von Grund auf mit Fokus auf Skalierbarkeit entwickelt. Stellen Sie sich einen großen Bibliothekskatalog vor: Anstatt alle Bücher in einem einzigen Regal zu stapeln, verteilen wir sie auf mehrere Regale (Shards) und erstellen Kopien (Replicas) für mehr Sicherheit und schnelleren Zugriff.
In OpenSearch sieht das so aus:
Sharding: Ein Index wird in mehrere Teilstücke (Shards) aufgeteilt
PUT /products
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}Replikation: Jeder Shard wird mindestens einmal repliziert
Automatische Verteilung: OpenSearch verteilt Shards und Replicas automatisch im Cluster
Eine der größten Stärken von OpenSearch ist seine REST API. Das macht den Zugang zu den Daten flexibel und unabhängig vom verwendeten Tool. Sie ist die zentrale Schnittstelle für alle Operationen und folgt einem intuitiven Muster. Hier einige Beispiele:
Ein Dokument indexieren:
PUT /products/_doc/P12345
{
"name": "Wasserdichte Digitalkamera XC-100",
"price": 299.99
}
Nach Dokumenten suchen:
GET /products/_search
{
"query": {
"match": {
"name": "wasserdichte kamera"
}
}
}
Den Cluster-Status prüfen:
GET /_cluster/health
Diese HTTP-basierte API bietet mehrere Vorteile:
OpenSearch eignet sich beispielsweise für:
Lassen Sie uns ein erstes praktisches Beispiel durchgehen. Wir erstellen einen Index für Produktdaten und führen einige grundlegende Operationen durch:
Index erstellen:
PUT /products
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": { "type": "text" },
"description": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" }
}
}
}Ein Produkt hinzufügen:
PUT /products/_doc/1
{
"name": "Wasserdichte Digitalkamera XC-100",
"description": "Perfekt für Outdoor-Aktivitäten",
"price": 299.99,
"category": "Kameras"
}Nach Produkten suchen:
GET /products/_search
{
"query": {
"match": {
"description": "outdoor"
}
}
}Diese Beispiele zeigen die grundlegenden Konzepte: