GH GambleHub

Technologie und Infrastruktur → Elasticsearch und Volltextsuche

Elasticsearch und Volltextsuche

1) Die Rolle von Elasticsearch

Elasticsearch (ES) ist ein verteiltes Such- und Analysesystem, das auf invertierten Indizes und Säulenstrukturen für Aggregationen basiert. Sie gibt:
  • Volltext: Relevanz (BM25), Morphologie, fuzzy/typo tolerant.
  • Facetten und Aggregationen: Schnelle Schnitte nach Attributen.
  • Hybride Suche: BM25 + Vektor kNN (Semantik).
  • Entwicklungsgeschwindigkeit: Abfrage DSL, ingest Pipelines, reiches Ökosystem.

Für iGaming/Fintech: Suche nach Spielen/Anbietern, Promo und Regeln, reaktionsschnelle Facetten (Anbieter, Volatilität, RTP, Sprache), Suche nach KYC/AML-Zeitschriften, Analyse von Logs und Alerts.


2) Datenmodell und Muppings

2. 1 Index und Feldtypen

'text' (analysiertes Feld) - für den Volltext.
'keyword' - die genauen Werte/Aggregationen/Sortierung.
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
'nested' - Arrays von Objekten mit korrekter Feldkorrelation.
'dense _ vector' - Vektordarstellungen (Embeddings).

2. 2 Multi-Field-Strategie

Speichern Sie das Feld in mehreren Ansichten: 'name. text'(analysiert), 'name. raw` (keyword), `name. ngram'(zur automatischen Vervollständigung).

json
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ru_morph",
"fields": {
"raw": { "type": "keyword", "ignore_above": 256 },
"ngram": { "type": "text", "analyzer": "edge_ngram_2_20" }
}
},
"provider": { "type": "keyword" },
"tags":   { "type": "keyword" },
"rtp":   { "type": "float" },
"released_at": { "type": "date" },
"lang":   { "type": "keyword" },
"embedding": { "type": "dense_vector", "dims": 384, "index": true, "similarity": "cosine" }
}
},
"settings": {
"analysis": {
"filter": {
"ru_stop": { "type": "stop", "stopwords": "_russian_" },
"ru_stemmer": { "type": "stemmer", "language": "russian" },
"syn_ru": { "type": "synonym", "lenient": true, "synonyms": [
"слот,игровой автомат => слот",
"джекпот,суперприз => джекпот"
] }
},
"analyzer": {
"ru_morph": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "ru_stop", "ru_stemmer", "syn_ru"]
},
"edge_ngram_2_20": {
"type": "custom",
"tokenizer": "edge_ngram",
"filter": ["lowercase"],
"char_filter": [],
"tokenizer": "edge_ngram"
}
},
"tokenizer": {
"edge_ngram": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20 }
}
}
}
}

2. 3 Nested für Facetten

Attribute der Ansicht 'features: [{Name, Wert}]' gestalten 'nested', sonst ergeben die Facetten falsche Übereinstimmungen.


3) Relevanz: BM25, Boost und Hybrid

3. 1 Klassiker (BM25)

Kombinieren Sie die Felder mit Gewichten (Titel ^ 4, Tags ^ 2, Beschreibung).
Verwenden Sie' minimum _ should _ match', um 'laute' Übereinstimmungen zu kontrollieren.

3. 2 Vektoren (kNN) + BM25 (rerank)

Embeddings (z.B. 384-768) in 'dense _ vector'.
Zuerst kNN nach Vektor (Top 200-500), dann Rescore BM25 + Business-Boosts (Neuheit, RTP, Regionallizenz).

Beispiel für eine hybride Abfrage:
json
{
"knn": {
"field": "embedding",
"query_vector": [/... /],
"k": 400, "num_candidates": 2000
},
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "египетские слоты джекпот",
"fields": ["title^4","tags^2","description"],
"type": "best_fields",
"minimum_should_match": "60%"
}}
],
"filter": [
{ "term": { "region": "TR" }},
{ "range": { "rtp": { "gte": 94.0 }}}
]
}
},
"rescore": {
"window_size": 400,
"query": {
"rescore_query": {
"function_score": {
"query": { "match_all": {} },
"boost_mode": "sum",
"functions": [
{ "gauss": { "released_at": { "scale": "180d", "offset": "30d", "decay": 0.5 } } },
{ "field_value_factor": { "field": "popularity", "factor": 0.2, "modifier": "log1p" } }
]
}
}
}
},
"highlight": { "fields": { "title": {}, "description": {} } }
}

4) Auto-Vervollständigung und Hinweise

Ansätze:
  • Rand N-Gramm auf dem Unterfeld 'Titel. ngram'(schnell, einfach).
  • Completion suggesters ('completion' -Feld) sind schnelle Hinweise, aber ein separater Indexierungspfad.
  • Search-as-you-type - Kombiniert die Tokenisierung, um Wörter und Phrasen zu beginnen.
Beispiel für Hinweise:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Synonyme, Tippfehler und Mehrsprachigkeit

Synonyme: Datei/Liste über 'synonym' Filter hochladen; Domains trennen (Casino/Sport).
Tippfehler: 'fuzziness: AUTO' in 'multi _ match', Länge und Ränder begrenzen. Für Hinweise ist 'fuzzy' der Abschlussmodus.

Mehrsprachigkeit:
  • Index-per-local (ru/en/tr/pt-BR) oder Multianalyse-Schema: „title _ ru“, „title _ en“.
  • Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
  • Verschieben Sie die Sprache in einen Routing-Schlüssel, um die Hot Locales näher am Benutzer zu halten.

6) Filter, Facetten und Aggregationen

Verwenden Sie für Facetten 'keyword' und 'nested' Aggregationen.
Vermeiden Sie Kardinalfelder (eindeutige IDs) in Aggregationen - bringen Sie sie in 'Laufzeitfelder' oder vorläufige Vitrinen.

Beispiel für Facetten:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Dateneingabe und Textbereinigung

Ingest Pipelines: Normalisierung, Feldextraktion, Geo-Encoding, HTML löschen.
Anhang/ingest-ocr (bei Bedarf): PDF/Bilder indexieren (PII beachten).
Lemmatisierung: über Analysatoren oder externe Pipelines (Precompute-Token).


8) Schards, Repliken und ILM

8. 1 Größen und Sharding

Weniger Shards sind besser. Ziel: 10-50 GB pro Shard für gemischte Lasten.
Beginnen Sie mit 'number _ of _ shards: 1-3', skalieren Sie nach der Tat. Repliken - mindestens 1 in der Produktion.

8. 2 ILM (Lifecycle)

Hot → Warm → Cold → Delete für Promo-Protokolle/Geschichte.
Komprimierung (force merge) für „kalte“ Segmente.
Für Kataloge und Produktsuche - „unbefristet“ heiß mit periodischer Optimierung.

8. 3 Algorithmus für Migrationen ohne Downtime

Der neue Index' games _ v2 '→ alias' games' wechselt nach 'reindex' und backfill. Deprecated fields - Entfernen Sie nach und nach.


9) Schnappschüsse, DR und Updates

Snapshots in Objektspeicher (S3/GCS), Zeitplan und Wiederherstellungsprüfung.
Roll-up-Updates von Knoten, überprüfen Sie die Schrott-Allokation awareness (durch Zonen).
DR-Pläne: gebietsübergreifende Replikation (CCR) für kritische Indizes (Verzeichnisse, Verzeichnisse).


10) Sicherheit und PII

TLS/mTLS zwischen Client und Cluster.
RBAC: Rollen pro Index/Operationen; Dev/Stage/Prod - getrennt.
PII/PCI: Felder mit personenbezogenen Daten nicht unnötig indizieren; Verwenden Sie ingest-masking.
Right to be forgotten: Speichern Sie Links zu Dokumenten zum Löschen per user_id; soft-delete + reindex/ankündigen.


11) Beobachtbarkeit und Suche SLO

Metriken:
  • P50/P95/P99 latency auf query, 4xx/5xx Fehler.
  • Cache hit (query cache / shard request cache).
  • Heap usage, GC паузы, segment merges, threadpools (search/write).
  • Hot shards/hot nodes, rejections.
  • KNN: `graph_hits`, `search_k`, latency, recall@k.
SLO-Beispiele:
  • Spielesuche: P95 ≤ 200 ms, Fehler <0. 5% im 30-Minuten-Fenster.
  • Hinweise: P95 ≤ 80ms.
  • KNN-Hybrid: P95 ≤ 350 ms für Top-20-Ergebnisse.

12) FinOps: Kosten und Leistung

Indexgröße: Sparen Sie durch Tokenisierung, deaktivieren Sie unnötige' fielddata', verwenden Sie' doc _ values' nur dort, wo es notwendig ist.
Segmente: Merge-Politik planen, nicht „zersplittern“ lassen.
KNN ist nach RAM/CPU teurer: dims, 'num _ candidates', Vorfilter auf BM25 begrenzen.
Heiße Felder im RAM: Felddaten/Heap überwachen; Nehmen Sie „schwere“ Aggregationen in separate Indizes.


13) Beispiele für Anfragen

13. 1 Mehrfeld-Volltext mit Boost

json
{
"query": {
"multi_match": {
"query": "book of",
"fields": ["title^4","title.ngram^2","tags^2","description"]
}
},
"sort": ["_score", { "released_at": "desc" }]
}

13. 2 Filter + Facetten

json
{
"query": {
"bool": {
"must": [{ "match": { "title": "египет" }}],
"filter": [
{ "terms": { "provider": ["Novomatic","PragmaticPlay"]}},
{ "range": { "rtp": { "gte": 95 }}}
]
}
},
"aggs": {
"by_provider": { "terms": { "field": "provider" } },
"by_year": { "date_histogram": { "field": "released_at", "calendar_interval": "year" } }
}
}

13. 3 Nested Attributfilterung

json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features.name": "volatility" }},
{ "term": { "features.value": "high" }}
]
}}
}
}
}

13. 4 Logsuche (ECS) mit Highlight

json
{
"query": {
"bool": {
"must": [{ "match_phrase": { "message": "payment declined" }}],
"filter": [
{ "term": { "service.name": "payments" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
},
"highlight": { "fields": { "message": { "number_of_fragments": 0 } } }
}

14) Multi-Tenant und Isolation

Index pro Tenant (besser) oder Feld 'tenant _ id' + ACL-Filter (teurer bei Aggregationen).
Routing durch 'tenant _ id' zur Lokalisierung von Shards.
Beschränke die Anfragen des Tenants auf Limits/Timeouts, 'query. phase` guard-rails.


15) Checkliste Umsetzung

1. Schema: 'text/keyword/nested' + Multifelder, 'dense _ vector' bei Bedarf.
2. Analysatoren pro Sprache, Synonyme, edge-ngram für Auto-Vervollständigung.
3. Relevanz: BM25 Boosts + Hybrid kNN→rescore.
4. Facetten: keyword/nested, Aggregationen nur nach „gesunden“ Feldern.
5. Indizierung: ingest pipelines (Normalisierung), batch loading.
6. Sharding: klein anfangen, alias für Umzüge, ILM für „lange“ Protokolle.
7. DR: Snapshots Zeitplan, Recovery Check, CCR für kritische Indizes.
8. Sicherheit: TLS, RBAC, PII-Maskierung, Löschrichtlinie.
9. Beobachtbarkeit: Latenz, Heap/GC, Cache Hit, Hot Shards, Rejections.
10. FinOps: Indexgröße, kNN Parametrierung, Deaktivierung der überflüssigen 'doc _ values/fielddata'.


16) Anti-Muster

Ein Index „für alle“: Verschiedene Domains (Verzeichnis, Protokolle, Transaktionen) erfordern unterschiedliche Einstellungen.
Gedankenlos „fuzziness: AUTO“ auf allen Feldern → langsam und laut.
Synonyme „essen Sinn“: Trennen Sie keine Wörterbuchdomänen.
Ohne nested, wo Feldbündel → falsche Facetten benötigt werden.
Zu viele Shards (einer pro Dokument) - Overhead für Cluster State.
Nichtverwendung von Alias bei Migrationen - Ausfallzeiten und „gebrochene“ Links.
PII-Indexierung „as is“ - regulatorische Risiken und teure Reindixe.


17) iGaming/Fintech Kontext: Schnelle Rezepte

Spielesuche: 'multi _ match' mit Boost 'title ^ 4', 'tags ^ 2', Facetten nach Anbieter/Volatilität, Filter nach Region/Währung, Hybrid mit Vektoren für 'theme' (z.B. 'egypt', 'fruit classic').
Promo/Boni: Synonyme („Freispiele“, „Freispiele“), Datenfilter 'active _ from/active _ to', Hinweise durch completion.
KYC/AML-Protokolle: ECS-Schema, Volltext durch 'message', Aggregationen durch 'rule _ name', 'country', Anomalien durch'@ timestamp 'Histogramm.
Anbieterverzeichnis: Keyword-Felder für Facetten und Sortierungen; Textbeschreibungen - 'text' mit Morphologie.
Regulatorische Seiten: mehrsprachige Felder, 'search _ as _ you _ type' für weiche Hinweise.


Ergebnis

Bei einer effektiven Suche auf Elasticsearch geht es nicht nur darum, „BM25 zu aktivieren“: Es handelt sich um die richtigen Analysatoren und Muppings, Multifelder und Nested, hybride VM25 + Vektoren, saubere Facetten und Aggregationen, die Disziplin Sharding und ILM, klare SLOs und Beobachtbarkeit sowie Sicherheit und FinOps. Mit diesen Prinzipien wird Ihre Suche schnell, relevant und vorhersehbar sein - und den Verkehrsspitzen der Produktplattform standhalten.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.