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).
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.
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'.
- 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.
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.
- 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.