GH GambleHub

Technologia i infrastruktura → Wyszukiwanie elastyczne i pełny tekst

Wyszukiwanie elastyczne i pełne teksty

1) Rola elastyczna search

Elasticsearch (ES) to rozproszony system wyszukiwania i analizy oparty na odwróconych indeksach i strukturach kolumn do agregacji. Daje:
  • Pełny tekst: znaczenie (BM25), morfologia, mgliste/typo tolerancyjne.
  • Fasety i agregacje: szybkie plasterki według atrybutów.
  • Wyszukiwanie hybrydowe: BM25 + wektor kNN (semantyka).
  • Szybkość rozwoju: Zapytanie DSL, rurociągi połykania, bogaty ekosystem.

W przypadku iGaming/fintech: wyszukiwanie gier/dostawców, promocji i zasad, szybkie reagowanie na fakty (dostawca, zmienność, RTP, język), wyszukiwanie magazynów KYC/AML, parsowanie dzienników i wpisów.


2) Model i mapowanie danych

2. 1 Indeks pola i typy

„text” dla pełnego tekstu.
„keyword” - dokładne wartości/agregacje/sort.
'data', 'long/double', 'boolean', 'ip', 'geo _ point'.
„zagnieżdżone” - tablice obiektów o prawidłowej korelacji pola.
„gęsty _ wektor” - reprezentacje wektorów (osadów).

2. 2 Strategia wielopolowa

Zapisz pole w kilku widokach: 'name. nazwa tekstu „,”. raw '(słowo kluczowe),' name. ngram' (do automatycznego wykonania).

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 Zagnieżdżone na fasety

Atrybuty formularza 'funkcje: [{nazwa, wartość}]' design 'gnieżdżone', w przeciwnym razie fasony dadzą fałszywe dopasowania.


3) Znaczenie: BM25, zwiększenie i hybryda

3. 1 Klasyka (BM25)

Połączyć pola z wagami (tytuł ^ 4, tagi ^ 2, opis).
Użyj 'minimum _ should _ match' do sterowania hałaśliwymi meczami.

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

Osadzenia (np. 384-768) w „gęstym _ wektorze”.
Najpierw kNN przez wektor (top 200-500), a następnie rescore BM25 + business boosts (nowość, RTP, licencja regionu).

Przykład zapytania hybrydowego:
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) Automatyczne zakończenie i polecenia

Podejścia:
  • Krawędź N-gram na podpolu '. ngram' (szybki, prosty).
  • Sugestie zakończenia (pole „zakończenie”) - szybkie wskazówki, ale oddzielna ścieżka indeksowania.
  • Search-as-you-type - łączy tokenizację do uruchamiania słów i zwrotów.
Wiersze próbki:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Synonimy, typos i wielojęzyczność

Synonimy: wczytaj plik/listę przez filtr 'synonim'; oddzielne domeny (kasyno/sport).
Typos: 'fuzziness: AUTO' w 'multi _ match', limit długości i pól. Dla wierszy - tryb ukończenia 'fuzzy'.

Wielojęzyczność:
  • Index-per-locale (ru/en/tr/pt-BR) lub multi-analyzer circuit: 'title _ ru', 'title _ en'.
  • Analizatory rurowe: „rosyjski”, „angielski”, „turecki”, „portugalski”.
  • Przenieś język do klawisza routingu, aby utrzymać gorące lokalizacje bliżej użytkownika.

6) Filtry, fasony i agregacje

W przypadku faset należy użyć „słowa kluczowego” i „zagnieżdżonej” agregacji.
Unikaj pól kardynalnych (unikalnych identyfikatorów) w agregacjach - wprowadzaj je do 'pól runtime' lub okien wstępnych.

Przykładowe aspekty:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Wprowadzanie danych i rozliczanie tekstów

Rurociągi: normalizacja, ekstrakcja pola, kodowanie geograficzne, usuwanie HTML.
Załącznik/ingest-ocr (w razie potrzeby): indeksowanie plików PDF/obrazu (ostrożnie z PII).
Lematyzacja: poprzez analizatory lub rurociągi zewnętrzne (tokeny prekomputerowe).


8) Odłamki, repliki i ILM

8. 1 Wymiary i Shitting

Mniej odłamków jest lepszych. Cel: 10-50GB na odłamek dla ładunków mieszanych.
Zacznij od 'number _ of _ shards: 1-3', skala w rzeczywistości. Repliki - co najmniej 1 w sprzedaży.

8. 2 ILM (cykl życia)

gorące → ciepłe → zimno → usuń dla dzienników/historia promo.
Siła łączy się dla zimnych segmentów.
Dla katalogów i wyszukiwania produktów - „perpetual” gorąco z okresową optymalizacją.

8. 3 Algorytm migracji bez przestojów

Nowy indeks 'games _ v2' → alias 'games' przełącza się po 'reindex' i backfill. Pola depresyjne - stopniowo usuwać.


9) Migawki, DR i aktualizacje

Migawki do obiektu pamięci masowej (S3/GCS), harmonogram i przywrócenie kontroli.
Aktualizacje węzłów, sprawdzanie świadomości przydziału odłamków (według stref).
Plany DR: replikacja międzyregionalna (CCR) dla indeksów krytycznych (katalogi, katalogi).


10) Bezpieczeństwo i PII

TLS/mTLS pomiędzy klientem a klastrem.
RBAC: role na indeks/operację; Dev/Stage/Prod - oddzielnie.
PII/PCI: nie indeksować niepotrzebnie pól z danymi osobowymi; Użyj maskowania.
Prawo do bycia zapomnianym: przechowywanie linków do dokumentów do usunięcia przez user_id; soft-delete + reindex/announcement.


11) Obserwowalność i wyszukiwanie SLO

Metryka:
  • P50/P95/P99 opóźnienia do zapytania, błędy 4xx/5xx.
  • Cache hit (zapytanie cache/shard request cache).
  • Użycie hałasu, GC мава, łączniki segmentowe, gwintowane (wyszukiwanie/pisanie).
  • Gorące strzały/gorące węzły, odrzucenia.
  • KNN: 'graph _ hits', 'search _ k', latency, recall @ k.
Przykłady SLO:
  • Wyszukiwanie gier: P95 ≤ 200 ms, błędy <0. 5% w oknie 30 min.
  • Wskazówki: P95 ≤ 80 ms.
  • Hybryda KNN: P95 ≤ 350ms dla najlepszych 20 wyników.

12) FinOps: koszt i wydajność

Rozmiar indeksu: zapisać tokenizację, wyłączyć zbędne 'fielddata', użyć 'doc _ values' tylko w razie potrzeby.
Segmenty: polityka łączenia planów, nie zezwalają na „podział”.
KNN jest droższy w pamięci RAM/CPU: limity, 'num _ candidates', pre-filtr na BM25.
Gorące pola w pamięci RAM: monitorowanie danych/hałasu; „ciężkie” agregacje w oddzielnych indeksach.


13) Wnioski o próbkę

13. 1 Multi-field pełny tekst z impulsem

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

13. 2 filtry + fasety

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 Zagnieżdżone filtrowanie atrybutów

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

13. 4 Wyszukiwanie dzienników (ECS) z podświetleniem

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-najemca i izolacja

Indeks do najemcy (lepszy) lub pole 'najemca _ id' + filtr ACL (droższy na agregacjach).
Routing przez 'lokator _ id', aby zlokalizować odłamki.
Ograniczenie żądań najemcy do limitów/terminów ', zapytanie. szyny ochronne fazy.


15) Lista kontrolna wdrażania

1. Schemat: 'tekst/słowo kluczowe/zagnieżdżone' + wielopolowe, 'gęsty _ wektor' w razie potrzeby.
2. Analizatory na język, synonimy, krawędź-ngram do autokompletacji.
3. Znaczenie: BM25 zwiększa + hybrydowe kNN → rescore.
4. Aspekty: słowo kluczowe/zagnieżdżone, agregacja tylko dla „zdrowych” pól.
5. Indeksowanie: rurociągi do spożycia (normalizacja), załadunek serii.
6. Shading: start mały, alias do poruszania, ILM do „długich” dzienników.
7. DR: harmonogram migawek, kontrola odzysku, CCR dla wskaźników krytycznych.
8. Bezpieczeństwo: TLS, RBAC, maskowanie PII, polityka usuwania.
9. Obserwowalność: opóźnienie, hałas/GC, hit pamięci podręcznej, strzały na gorąco, odrzucenia.
10. FinOps: rozmiar indeksu, parametryzacja kNN, wyłączanie dodatkowych 'doc _ values/fielddata'.


16) Anty-wzory

Jeden indeks „dla wszystkich”: różne domeny (katalog, dzienniki, transakcje) wymagają różnych ustawień.
Bezmyślna „fuzzowość: AUTO” → powoli i głośno we wszystkich dziedzinach.
Synonimy „zjedz znaczenie”: nie oddzielaj domen słownikowych.
Bez gniazda, gdzie pakiety pola → fałszywe aspekty są potrzebne.
Zbyt wiele odłamków (jeden na dokument) - stan klastra napowietrzny.
Nieużywanie aliasu podczas migracji - przestoje i zerwane linki.
Indeksacja PII „jak jest” - ryzyko regulacyjne i kosztowne renifery.


17) Kontekst iGaming/fintech: Szybkie przepisy kulinarne

Wyszukiwanie gier: 'multi _ match' z boost 'title ^ 4', 'tags ^ 2', facets by provider/volatility, filters by region/currency, hybrid with wectors for „topics” (na przykład, „Egipt”, „fruit classic”).
Promo/bonusy: synonimy („freespins”, „free spins”), filtry danych 'active _ from/active _ to', porady przez zakończenie.
Dzienniki KYC/AML: schemat ECS, pełny tekst przez 'message', agregacje przez 'rule _ name', 'country', anomalie przez '@ timestamp' histogram.
Katalog dostawców: pola słów kluczowych dla aspektów i rodzajów; opisy tekstowe - „tekst” z morfologią.
Strony regulacyjne: wielojęzyczne pola, 'search _ as _ you _ type' dla miękkich wskazówek.


Wynik

Skuteczne wyszukiwanie na Elasticsearch to nie tylko „włączanie BM25”: są to odpowiednie analizatory i mapowania, wielowarstwowe i zagnieżdżone, hybryda BM25 + wektorów, schludne aspekty i agregacje, dyscyplina shading i ILM, jasne SLO i obserwowalność, a także bezpieczeństwo i F InOps. Dzięki tym zasadom Twoje wyszukiwanie będzie szybkie, istotne i przewidywalne - i wytrzyma szczyty w ruchu platformy produktowej.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.