Elasticsearch - Volltextsuche in Anwendungen
Elasticsearch Volltextsuche in
technologieElasticsearch: Volltextsuche in Anwendungen
Elasticsearch ist eine verteilte Such- und Analyse-Engine, die die Art und Weise revolutioniert hat, wie Anwendungen die Volltextsuche handhaben. Aufgebaut auf Apache Lucene, bietet es außergewoehnliche Geschwindigkeit, Skalierbarkeit und Flexibilitaet. In diesem Artikel erklaeren wir, wie Elasticsearch im Detail funktioniert, wie man es einsetzt und wie man sein volles Potenzial in Produktionsanwendungen ausschoepft.
Was ist Elasticsearch?#
Elasticsearch ist eine Open-Source-NoSQL-Datenbank, die speziell fuer die Volltextsuche und Echtzeit-Datenanalyse entwickelt wurde. Die wichtigsten Merkmale sind:
- Verteilte Engine - automatisches Sharding und Datenreplikation
- Volltextsuche - fortgeschrittene Ranking-Algorithmen (BM25)
- Echtzeit-Analyse - Live-Aggregationen und Metriken
- RESTful API - Kommunikation ueber HTTP/JSON
- Horizontale Skalierbarkeit - einfaches Hinzufuegen von Knoten zum Cluster
- Nahezu Echtzeit - Dokumente sind innerhalb von ~1 Sekunde nach der Indexierung durchsuchbar
Elasticsearch wird ueberall dort eingesetzt, wo schnelle und intelligente Suche benoetigt wird - von E-Commerce-Shops ueber Logging-Systeme bis hin zu Analyseplattformen.
Der invertierte Index - das Herzstuck von Elasticsearch#
Der Schluessel zur Leistung von Elasticsearch ist der invertierte Index (Inverted Index). Im Gegensatz zu traditionellen Datenbanken, die Dokumente sequentiell durchsuchen, bildet ein invertierter Index Begriffe (Woerter) auf die Dokumente ab, die sie enthalten.
Wie funktioniert der invertierte Index?#
Nehmen wir an, wir haben drei Dokumente:
| Dokument | Inhalt | |----------|--------| | Doc 1 | "Elasticsearch ist schnell" | | Doc 2 | "Schnelle Datensuche" | | Doc 3 | "Elasticsearch unterstuetzt Volltextsuche" |
Der invertierte Index sieht so aus:
| Begriff | Dokumente | |---------|-----------| | elasticsearch | Doc 1, Doc 3 | | ist | Doc 1 | | schnell | Doc 1, Doc 2 | | suche | Doc 2, Doc 3 | | daten | Doc 2 | | unterstuetzt | Doc 3 | | volltext | Doc 3 |
Dadurch liefert die Suche nach "suche elasticsearch" sofort die Dokumente 2 und 3 zurueck, ohne die gesamte Datenbank durchsuchen zu muessen. Genau das ermoeglicht es Elasticsearch, Millionen von Dokumenten in Millisekunden zu durchsuchen.
Elasticsearch mit Docker starten#
Der schnellste Weg, Elasticsearch zu starten, ist mit Docker. Hier ist eine Docker-Compose-Konfiguration:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- elastic
volumes:
es_data:
driver: local
networks:
elastic:
driver: bridge
Nach dem Start (docker-compose up -d) ist Elasticsearch unter http://localhost:9200 und Kibana unter http://localhost:5601 erreichbar.
# Pruefen, ob der Cluster laeuft
curl -X GET "localhost:9200/_cluster/health?pretty"
Mapping und Analyzers#
Was ist Mapping?#
Mapping ist das Datenschema in Elasticsearch - es definiert Feldtypen und wie sie indexiert werden. Es ist vergleichbar mit einem Tabellenschema in relationalen Datenbanken, aber deutlich flexibler.
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "german",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"description": {
"type": "text",
"analyzer": "german"
},
"price": {
"type": "float"
},
"category": {
"type": "keyword"
},
"created_at": {
"type": "date"
},
"in_stock": {
"type": "boolean"
},
"tags": {
"type": "keyword"
}
}
}
}
Feldtypen#
- text - analysierter Text fuer die Volltextsuche
- keyword - exakte Werte (Filter, Sortierung, Aggregationen)
- integer/float/long - numerische Werte
- date - Daten und Zeitstempel
- boolean - logische Werte
- nested - verschachtelte Objekte mit erhaltenen Beziehungen
- geo_point - geografische Koordinaten
Text-Analyzers#
Analyzers transformieren Text, bevor er im invertierten Index gespeichert wird. Der Analyseprozess besteht aus drei Phasen:
- Character Filters - Zeichentransformation (z.B. HTML-Entfernung)
- Tokenizer - Aufteilung des Textes in Token (Woerter)
- Token Filters - Token-Modifikation (Kleinschreibung, Stemming, Synonyme)
PUT /products
{
"settings": {
"analysis": {
"analyzer": {
"custom_german": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"german_stop",
"german_stemmer",
"synonym_filter"
]
}
},
"filter": {
"german_stop": {
"type": "stop",
"stopwords": "_german_"
},
"german_stemmer": {
"type": "stemmer",
"language": "german"
},
"synonym_filter": {
"type": "synonym",
"synonyms": [
"laptop,notebook,tragbarer computer",
"telefon,smartphone,handy"
]
}
}
}
}
}
Dank der Analyzers findet eine Suche nach "Computern" auch Dokumente, die "Computer", "Rechner" oder "Notebook" enthalten.
Volltextsuche - Abfragen#
Dokumente indexieren#
Bevor wir suchen koennen, muessen wir Dokumente zum Index hinzufuegen:
POST /products/_doc/1
{
"name": "Dell XPS 15 Laptop",
"description": "Leistungsstarker Laptop fuer Arbeit und Unterhaltung mit Intel i7 Prozessor",
"price": 1499.99,
"category": "laptops",
"tags": ["dell", "xps", "intel", "laptop"],
"in_stock": true,
"created_at": "2024-01-15"
}
POST /products/_doc/2
{
"name": "MacBook Pro 14 M3",
"description": "Professionelles Apple-Notebook mit M3 Pro Chip fuer kreative Aufgaben",
"price": 2199.00,
"category": "laptops",
"tags": ["apple", "macbook", "m3", "laptop"],
"in_stock": true,
"created_at": "2024-02-01"
}
Fuer die Massenindexierung verwenden Sie die Bulk-API:
POST /products/_bulk
{"index": {"_id": "3"}}
{"name": "Samsung Galaxy S24", "description": "Flaggschiff-Smartphone mit KI-Funktionen", "price": 899.00, "category": "telefone", "tags": ["samsung", "galaxy", "smartphone"], "in_stock": true}
{"index": {"_id": "4"}}
{"name": "iPhone 15 Pro", "description": "Neuestes Apple-Telefon mit Titangehaeuse", "price": 1199.00, "category": "telefone", "tags": ["apple", "iphone", "smartphone"], "in_stock": false}
Grundlegende Abfragen#
Match Query - Volltextsuche
GET /products/_search
{
"query": {
"match": {
"description": "leistungsstarker Laptop fuer Arbeit"
}
}
}
Multi-Match Query - Suche ueber mehrere Felder
GET /products/_search
{
"query": {
"multi_match": {
"query": "apple laptop",
"fields": ["name^3", "description", "tags^2"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
}
Der Operator ^3 bedeutet, dass das Feld name dreifach gewichtet wird im Ergebnis-Ranking.
Bool Query - Bedingungen kombinieren
GET /products/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"description": "laptop"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": 500,
"lte": 2000
}
}
},
{
"term": {
"in_stock": true
}
}
],
"should": [
{
"match": {
"tags": "intel"
}
}
],
"must_not": [
{
"term": {
"category": "zubehoer"
}
}
]
}
}
}
- must - erforderliche Bedingungen (beeinflussen den Score)
- filter - erforderliche Bedingungen (kein Score-Einfluss, gecacht)
- should - optionale Bedingungen (erhoehen den Score)
- must_not - Ausschlussbedingungen
Fuzzy Search - fehlertolerante Suche
GET /products/_search
{
"query": {
"match": {
"name": {
"query": "laptpo",
"fuzziness": "AUTO"
}
}
}
}
Fuzziness ermoeglicht es, Ergebnisse trotz Tippfehlern zu finden - "laptpo" findet "laptop".
Phrasensuche und Highlighting#
GET /products/_search
{
"query": {
"match_phrase": {
"description": {
"query": "Laptop fuer Arbeit",
"slop": 2
}
}
},
"highlight": {
"fields": {
"description": {
"pre_tags": ["<strong>"],
"post_tags": ["</strong>"],
"fragment_size": 150
}
}
}
}
Der Parameter slop gibt die erlaubte Anzahl von Positionen zwischen Phrasenwoertern an.
Aggregationen - Datenanalyse#
Aggregationen sind ein leistungsstarker Elasticsearch-Mechanismus zur Datenanalyse - das Aequivalent von GROUP BY in SQL, aber deutlich vielseitiger.
Bucket-Aggregationen#
GET /products/_search
{
"size": 0,
"aggs": {
"categories": {
"terms": {
"field": "category",
"size": 10
}
},
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "key": "guenstig", "to": 500 },
{ "key": "mittelklasse", "from": 500, "to": 1000 },
{ "key": "premium", "from": 1000, "to": 2000 },
{ "key": "luxus", "from": 2000 }
]
}
}
}
}
Metrik-Aggregationen#
GET /products/_search
{
"size": 0,
"aggs": {
"avg_price": {
"avg": { "field": "price" }
},
"price_stats": {
"stats": { "field": "price" }
},
"category_avg_price": {
"terms": {
"field": "category"
},
"aggs": {
"avg_price": {
"avg": { "field": "price" }
}
}
}
}
}
Aggregationen sind aeusserst nuetzlich fuer die Erstellung von Facettenfiltern in E-Commerce-Shops - wie dynamische Preisfilter, Kategorien mit Produktanzahl und beliebte Tags.
ELK-Stack - Elasticsearch, Logstash, Kibana#
Der ELK-Stack (auch als Elastic Stack bekannt) ist eine Sammlung von Werkzeugen fuer zentralisiertes Logging und Datenanalyse:
Komponenten#
- Elasticsearch - Datenspeicherung und -suche
- Logstash - Log-Sammlung, -Transformation und -Laden
- Kibana - Datenvisualisierung und -exploration
- Beats - leichtgewichtige Datensammel-Agenten (Filebeat, Metricbeat, Heartbeat)
Logstash-Konfiguration#
input {
beats {
port => 5044
}
}
filter {
if [type] == "nginx" {
grok {
match => {
"message" => '%{IPORHOST:remote_addr} - %{USER:remote_user} \[%{HTTPDATE:time_local}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}" %{NUMBER:status} %{NUMBER:body_bytes_sent}'
}
}
date {
match => ["time_local", "dd/MMM/yyyy:HH:mm:ss Z"]
}
geoip {
source => "remote_addr"
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logs-nginx-%{+YYYY.MM.dd}"
}
}
Kibana - Visualisierung#
Kibana ermoeglicht die Erstellung interaktiver Dashboards mit Elasticsearch-Daten. Die wichtigsten Funktionen sind:
- Discover - Rohdaten-Exploration mit Filterung
- Visualize - Diagrammerstellung (Kreis-, Balken-, Linien-, Heatmap-Diagramme)
- Dashboard - Zusammenfuegen von Visualisierungen zu interaktiven Panels
- Dev Tools - Konsole zur Ausfuehrung von REST-API-Abfragen
- Lens - intuitiver Drag-and-Drop-Visualisierungseditor
Anwendungsfaelle#
E-Commerce-Suche#
Elasticsearch ist ideal fuer die Integration erweiterter Suchfunktionen in Online-Shops:
- Autocomplete - Vorschlaege waehrend der Eingabe
- Facettenfilter - dynamische Preis-, Kategorie- und Markenfilter
- Unscharfe Suche - Tippfehlertoleranz
- Synonyme - "Telefon" = "Smartphone" = "Handy"
- Personalisierung - Ergebnis-Boosting basierend auf der Benutzerhistorie
GET /products/_search
{
"suggest": {
"product-suggest": {
"prefix": "sam",
"completion": {
"field": "suggest",
"size": 5,
"fuzzy": {
"fuzziness": 1
}
}
}
}
}
Zentralisiertes Logging#
Sammlung von Logs aus mehreren Microservices an einem zentralen Ort:
- Anwendungslogs (Fehler, Warnungen, Debug)
- Zugriffslogs (Nginx, Apache)
- Systemmetriken (CPU, RAM, Festplatte)
- Request-Tracing
Business-Analytik#
- Analyse von Verkaufstrends ueber die Zeit
- Echtzeit-KPI-Monitoring
- Berichterstattung und Dashboards
- Analyse des Benutzerverhaltens
Geosuche#
GET /stores/_search
{
"query": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 52.5200,
"lon": 13.4050
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 52.5200,
"lon": 13.4050
},
"order": "asc"
}
}
]
}
Vergleich mit Alternativen#
Elasticsearch vs. Algolia#
| Merkmal | Elasticsearch | Algolia | |---------|--------------|---------| | Hosting | Self-hosted / Cloud | SaaS | | Kosten | Open-Source (Infrastruktur) | Pay per Search | | Konfiguration | Fortgeschritten | Minimal | | Skalierbarkeit | Unbegrenzt | Automatisch | | Anpassbarkeit | Vollstaendig | Begrenzt | | Analytik | Aggregationen, ELK | Integriert | | Latenz | ~10-50ms | ~1-20ms | | Anwendungsfall | Komplexe Systeme | Schneller Search-as-a-Service |
Algolia eignet sich besser fuer einfache Suchanwendungen in Frontend-Applikationen, bei denen eine sofortige Einrichtung wichtig ist. Elasticsearch ueberzeugt bei komplexen Anforderungen, Datenanalyse und voller Infrastrukturkontrolle.
Elasticsearch vs. Meilisearch#
| Merkmal | Elasticsearch | Meilisearch | |---------|--------------|-------------| | Sprache | Java | Rust | | Speicher | Anspruchsvoll (JVM) | Leichtgewichtig | | Konfiguration | Komplex | Einfach | | Funktionsumfang | Umfassend | Grundlegend | | Aggregationen | Fortgeschritten | Grundlegende Filter | | Produktionsreife | Enterprise-ready | Reifend | | Tippfehlertoleranz | Fuzzy + phonetisch | Eingebaute Tippfehlertoleranz |
Meilisearch ist eine ausgezeichnete Wahl fuer kleinere Projekte, die schnelle Suche mit minimaler Konfiguration benoetigen. Elasticsearch bleibt der Standard fuer Enterprise-Systeme und fortgeschrittene Analytik.
Leistungsoptimierung#
1. Mapping-Optimierung#
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "5s"
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "german"
},
"internal_id": {
"type": "keyword",
"index": false
}
}
}
}
- Setzen Sie
index: falsefuer Felder, nach denen Sie nicht suchen - Deaktivieren Sie
_sourcefuer grosse Dokumente (wenn Sie das Original nicht benoetigen) - Verwenden Sie
keywordstatttextfuer Felder, die keine Analyse erfordern
2. Abfrage-Optimierung#
GET /products/_search
{
"_source": ["name", "price", "category"],
"query": {
"bool": {
"filter": [
{ "term": { "category": "laptops" } },
{ "range": { "price": { "gte": 500 } } }
]
}
},
"size": 20,
"from": 0
}
- Verwenden Sie
filterstattmustfuer Bedingungen ohne Scoring - gefilterte Ergebnisse werden gecacht - Beschraenken Sie die Felder in
_sourceauf das Noetige - Vermeiden Sie tiefe Paginierung (
from> 10000) - verwenden Sie stattdessensearch_after
3. Bulk-Operationen#
POST /_bulk
{"index": {"_index": "products", "_id": "1"}}
{"name": "Produkt 1", "price": 100}
{"index": {"_index": "products", "_id": "2"}}
{"name": "Produkt 2", "price": 200}
Verwenden Sie immer die Bulk-API fuer Massenoperationen - sie ist deutlich effizienter als das einzelne Indexieren von Dokumenten.
4. Cluster-Monitoring#
# Cluster-Gesundheit
curl -X GET "localhost:9200/_cluster/health?pretty"
# Index-Statistiken
curl -X GET "localhost:9200/_cat/indices?v"
# Knotenlast
curl -X GET "localhost:9200/_cat/nodes?v&h=name,heap.percent,cpu,load_1m"
# Hot Threads - Diagnose langsamer Operationen
curl -X GET "localhost:9200/_nodes/hot_threads"
5. Index Lifecycle Management (ILM)#
Automatisiertes Index-Lebenszyklus-Management - besonders nuetzlich fuer Logs:
PUT /_ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
}
}
},
"warm": {
"min_age": "30d",
"actions": {
"shrink": { "number_of_shards": 1 },
"forcemerge": { "max_num_segments": 1 }
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
Checkliste fuer die Bereitstellung#
Stellen Sie vor dem Produktionseinsatz sicher, dass:
- [ ] Mapping definiert ist (verlassen Sie sich nicht auf Dynamic Mapping)
- [ ] Analyzers fuer unterstuetzte Sprachen konfiguriert sind
- [ ] Shard-Anzahl an die Datengroesse angepasst ist
- [ ] Replikate aktiviert sind (mindestens 1 Replikat)
- [ ] JVM-Heap auf max. 50% des RAM eingestellt ist (nicht mehr als 32GB)
- [ ] Snapshot und Restore konfiguriert sind
- [ ] Cluster-Monitoring aktiviert ist
- [ ] ILM fuer Log-Indizes eingerichtet ist
- [ ] Sicherheit (Authentifizierung und Autorisierung) aktiviert ist
- [ ] Lasttests durchgefuehrt wurden
Zusammenfassung#
Elasticsearch ist eine leistungsstarke Suchmaschine, die:
- Blitzschnelle Suche bietet - Millisekunden-Antworten auf komplexe Abfragen
- Volltextsuche beherrscht - mit morphologischer Analyse, Synonymen und unscharfer Suche
- Horizontal skaliert - von einem einzelnen Knoten bis zu Clustern mit Hunderten von TB an Daten
- Echtzeit-Analytik liefert - Aggregationen und Dashboards in Kibana
- Sich in das Oekosystem integriert - ELK-Stack, Beats, Clients fuer jede Programmiersprache
Fuer kleinere Projekte sind Meilisearch oder Algolia eine Ueberlegung wert, aber wenn Sie volle Kontrolle, fortgeschrittene Aggregationen und Enterprise-Skalierbarkeit benoetigen, bleibt Elasticsearch der unangefochtene Marktfuehrer.
Brauchen Sie Unterstuetzung?#
Bei MDS Software Solutions Group helfen wir bei:
- Implementierung der Elasticsearch-Suche in Anwendungen
- Einrichtung des ELK-Stacks fuer zentralisiertes Logging
- Optimierung der Abfrageleistung und Cluster-Konfiguration
- Migration von anderen Suchloesungen
- Aufbau von Analysesystemen auf Basis des Elastic Stacks
Kontaktieren Sie uns, um Ihr Projekt zu besprechen!
Team von Programmierexperten, die sich auf moderne Webtechnologien spezialisiert haben.
