GH GambleHub

Tecnologia e Infrastruttura → Elasticsearch e ricerca in formato full-text

Elasticsearch e ricerca full text

1) Ruolo Elasticsearch

Elasticsearch (ES) è un sistema di ricerca e analisi distribuito basato su indici invertiti e strutture invertebrate per aggregazioni. Lei dà:
  • Full text: appropriatezza (BM25), morfologia, fuzzy/typo tolerant.
  • Sfaccettature e aggregazioni - Taglio rapido per attributi.
  • Ricerca ibrida BM25 + vettori (semantica).
  • Velocità di sviluppo: Query DSL, ingest pipelines, ricco ecosistema.

Per iGaming/Fintech: ricerca di giochi/provider, promo e regole, sfaccettature di risposta rapida (provider, volatilità, RTP, lingua), ricerca di registri KYC/AML, analisi di loghi e alert.

2) Modello di dati e mapping

2. 1 Indice e tipi di campo

'text' (campo analizzato) è per il testo completo.
«keyboard» è il valore esatto/aggregazione/ordinamento.
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
«nested» è un array di oggetti con una corretta correlazione dei campi.
dense _ vector è una rappresentazione vettoriale (embedding).

2. 2 Strategia multi-campo

Memorizza il campo in più viste: 'name. text '(analizzato),' name. raw` (keyword), `name. ngram '(per completamento automatico).

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": [
"slot, slot machine => slot,"
"jackpot, super prize => jackpot"
] }
},
"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 per sfaccettature

Gli attributi della vista «features: [{name, value}]» personalizza «nested», altrimenti le sfaccettature daranno false corrispondenze.

3) Rilevanza: BM25, bust e ibrido

3. 1 Classico (BM25)

Combinare i campi con i pesi (title ^ 4, tags ^ 2, descrizione).
Usa «minimo _ should _ match» per controllare le corrispondenze «rumorose».

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

Embedding (ad esempio 384-768) in'dense _ vector '.
Prima di tutto il vettore (top 200-500), poi rescore BM25 + business bust (novità, RTP, licenza regionale).

Esempio di richiesta ibrida:
json
{
"knn": {
"field": "embedding",
"query_vector": [/... /],
"k": 400, "num_candidates": 2000
},
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "Egyptian jackpot slots,"
"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) Completamento automatico e suggerimenti

Approcci:
  • Edge N-gram sul sottolivello dì title ". ngram '(veloce, semplice).
  • Compilation sugesters ('complettion'campo) - Suggerimenti rapidi, ma un percorso di indicizzazione separato.
  • Search-as-you-type - Unisce la tokenizzazione per iniziare la parola e le parole.
Esempio di suggerimenti:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Sinonimi, omissioni e multilinguismo

Sinonimi: scarica il file/elenco attraverso il filtro «synonym»; separare i domini (casinò/sport).
Failover: «fuzzover: AUTO» in «multi _ match», limitare la lunghezza e i campi. Per i suggerimenti, la modalità «fuzzy» è una complettività.

Multilinguismo:
  • Indice-per-locale (ru/en/tr/pt-BR) o diagramma multianalizzatore: 'title _ ru', 'title _ en'.
  • Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
  • Spostare la lingua nella chiave di instradamento per tenere i locali hot più vicini all'utente.

6) Filtri, sfaccettature e aggregazioni

Per le sfaccettature, utilizzare «keyboard» e «nested» aggregazioni.
Evitare campi radicali (ID univoci) nelle aggregazioni - porta in «runtime fields» o nelle vetrine preliminari.

Esempio di sfaccettatura:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Immissione e cancellazione del testo

Ingest pipelines: normalizzazione, recupero dei campi, geo-encoding, eliminazione HTML.
Attachment/ingest-ocr (se necessario): indicizzazione PDF/immagini (con attenzione al PII).
Lemmatizzazione tramite analizzatori o pipline esterne (precompute token).

8) Schard, repliche e ILM

8. 1 Dimensioni e sharding

Meno sardi, meglio. Obiettivo: 10-50 GB per shard per carichi misti.
Inizia con'number _ of _ shards: 1-3 ', ridimensiona il dato. Repliche: almeno 1 in vendita.

8. 2 ILM (Lifecycle)

hot → warm → cold → delete per i loghi/storia promo.
Compressione (force merge) per i segmenti «freddi».
Per le directory e le ricerche di prodotto, hot a tempo indeterminato con ottimizzazione periodica.

8. 3 Algoritmo migrazione senza downtime

Il nuovo indice «games _ v2» si sposta dopo «reindex» e «backfill». Campi Deprecated - Rimuovi gradualmente.

9) Snapshot, DR e aggiornamenti

Snapshots nell'archivio oggetti (S3/GCS), pianificazione e verifica del ripristino.
Aggiornamenti rolling nodi, verifica shard allocation awareness (per zone).
Piani DR Replica crociata (CCR) per indici critici (guide, directory).

10) Sicurezza e PII

TLS/mTLS tra il cliente e il cluster.
RBAC ruoli indice/operazione Dave/Stage/Prod - separati.
PII/PCI: non indicizzare campi con dati personali senza necessità; Utilizzare la maschera ingest.
Right to be forgotten - Memorizza i collegamenti ai documenti da eliminare tramite user _ id; soft-delete + reindex/annuncio.

11) Osservabilità e ricerca SLO

Metriche:
  • P50/P95/P99 latency su query, errori 4xx/5xx.
  • 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.
Esempi SLO:
  • Cerca giochi P95 da 200 ms, errori <0. 5% in una finestra di 30 minuti.
  • Il P95 ha 80 mc.
  • KNN ibrido: P95 da 350 ms per i risultati top-20.

12) FinOps: costo e prestazioni

Dimensioni indice: risparmia con il torneggio, disattiva le «fielddata» inutili, usa «doc _ values» solo dove vuoi.
Segmenti - Pianificare una politica merge, non permettere la fusione.
KNN è più costoso per RAM/CPU: limita dims, 'num _ candidates', pre-filter su BM25.
Campi hot in RAM: monitor field data/heap; trascinare le aggregazioni «pesanti» nei singoli indici.

13) Esempi di query

13. 1 Full text multi-campo con bust

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

13. 2 Filtri + sfaccettature

json
{
"query": {
"bool": {
"must": [{"match": {"title": "egypt"}}],
"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 Filtraggio degli attributi Nested

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

13. 4 Ricerca per logi (ECS) con 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-tenente e isolamento

Indice per tenante (migliore) o campo «tenant _ id» + filtro ACL (più costoso sulle aggregazioni).
Routing per «tenant _ id» per la localizzazione dei chard.
Limitare le richieste del tenante a limiti/timeout, 'query. phase` guard-rails.

15) Assegno-foglio di implementazione

1. Schema: 'text/keyboard/nested' + multiplo, 'dense _ vector', se necessario.
2. Analizzatori per-lingua, sinonimi, edge-ngram per completamento automatico.
3. Rilevanza BM25 bust + ibrido kNN→rescore.
4. Facette: keyboard/nested, aggregazioni solo per campi «sani».
5. Indicizzazione: ingest pipelines (normalizzazione), caricamento batch.
6. Sharding: inizia con il piccolo, alias per spostamenti, ILM per i cavi «lunghi».
7. DR: pianificazione snapshots, verifica del ripristino, CCR per gli indici critici.
8. Sicurezza: TLS, RBAC, Maschera PII, Criteri di eliminazione.
9. Osservabilità latency, heap/GC, cache hit, hot shards, rejection.
10. FinOps: dimensione indice, parametrizzazione kNN, disattivazione di «doc _ values/fieldata».

16) Anti-pattern

Un singolo indice per tutti: i domini diversi (directory, login, transazioni) richiedono impostazioni diverse.
L'insopportabile «fuzzover: AUTO» su tutti i campi è lento e rumoroso.
I sinonimi «mangia il senso» non separano i domini dei dizionari.
Senza nested, dove servono legamenti di campo, sfaccettature false.
Troppi sardi (uno per documento) - Spese generali per cluster state.
Non utilizzare alias per migrazioni - interruzioni e collegamenti a bit.
L'indicizzazione PII «com'è» - rischi regolatori e reindex costosi.

17) Contesto iGaming/Fintech: ricette veloci

Cerca giochi: «multi _ match» con «title ^ 4», «tags ^ 2», sfaccettature per provider/volatilità, filtri per regione/valuta, ibrido con vettori per «argomenti» (ad esempio «egitto», «frute classic»).
Promo/bonus: sinonimi («frisine», «free spins»), filtri di data «active _ from/active _ to», suggerimenti via complition.
Registri KYC/AML: schema ECS, full-text per "messagge', aggregazione per" rule _ name "," country ", anomalie per" @ timestamp "istogramma.
Elenco provider: campi keyboard per sfaccettature e ordinamenti descrizioni testuali: «text» con morfologia.
Le pagine regolatorie sono campi multi-lingue, 'search _ as _ you _ type' per suggerimenti morbidi.

Totale

Una ricerca efficace su Elasticsearch non è solo «abilitare BM25»: analizzatori e mapping corretti, multiplo e nested, ibrido VM25 + vettori, sfaccettature e aggregazioni accurate, disciplina charding e ILM, nitido SLO, osservabilità, sicurezza e sicurezza. Con questi principi, la vostra ricerca sarà rapida, appropriata e prevedibile - e resisterà ai picchi di traffico della piattaforma alimentare.

Contact

Mettiti in contatto

Scrivici per qualsiasi domanda o richiesta di supporto.Siamo sempre pronti ad aiutarti!

Avvia integrazione

L’Email è obbligatoria. Telegram o WhatsApp — opzionali.

Il tuo nome opzionale
Email opzionale
Oggetto opzionale
Messaggio opzionale
Telegram opzionale
@
Se indichi Telegram — ti risponderemo anche lì, oltre che via Email.
WhatsApp opzionale
Formato: +prefisso internazionale e numero (ad es. +39XXXXXXXXX).

Cliccando sul pulsante, acconsenti al trattamento dei dati.