GH GambleHub

Texnologiya və infrastruktur → Elasticsearch və tam mətnli axtarış

Elasticsearch və tam mətnli axtarış

1) Elasticsearch rolu

Elasticsearch (ES) - aqreqasiya üçün tərs indekslər və sütun strukturları əsasında paylanmış axtarış və analitik sistemdir. O verir:
  • Tam mətn: müvafiq (BM25), morfologiya, fuzzy/typo tolerant.
  • Fasetlər və aqreqasiyalar: atributlara görə sürətli kəsiklər.
  • Hibrid axtarış: BM25 + vektor kNN (semantika).
  • İnkişaf sürəti: Query DSL, ingest pipelines, zəngin ekosistem.

iGaming/fintech üçün: oyunların/provayderlərin, promo və qaydaların axtarışı, tez cavab verən fasetlər (provayder, dəyişkənlik, RTP, dil), KYC/AML jurnallarının axtarışı, log və alertlərin təhlili.


2) Data modeli və mappinqlər

2. 1 İndeks və sahə növləri

'text' (analiz olunan sahə) - tam mətn üçün.
'keyword' - dəqiq qiymətlər/aqreqasiya/çeşidləmə.
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
'nested' - sahələrin düzgün korrelyasiyası olan obyektlərin massivləridir.
'dense _ vector' - vektor təqdimatları (embeddinq).

2. 2 Multipol strategiyası

Sahəni bir neçə növdə saxlayın: 'name. text '(təhlil edilə bilər),' name. raw` (keyword), `name. ngram '(avtomatik tamamlama üçün).

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. Fasetlər üçün 3 Nested

Növün atributları 'features: [{name, value}]' nested 'tərtib edin, əks halda fasetlər yanlış uyğunluq verəcəkdir.


3) Müvafiq: BM25, bust və hibrid

3. 1 Klassik (BM25)

Tartı ilə sahələri birləşdirin (title ^ 4, tags ^ 2, description).
«Səs-küylü» təsadüflərə nəzarət etmək üçün 'minimum _ should _ match' istifadə edin.

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

Embeddinq (məsələn, 384-768) 'dense _ vector'.
Əvvəlcə vektor üzrə kNN (top 200-500), sonra rescore BM25 + biznes gücləndiriciləri (yenilik, RTP, region lisenziyası).

Hibrid sorğu nümunəsi:
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) Avtomatik tamamlama və ipuçları

Yanaşmalar:
  • Edge N-gram yeraltı 'title. ngram '(tez, sadə).
  • Completion suggesters ('completion' sahəsi) - sürətli ipuçları, lakin ayrı bir indeksləşdirmə yolu.
  • Search-as-you-type - söz və ifadələrin başlanğıcı üçün tokenizasiyanı birləşdirir.
Nümunə ipuçları:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Sinonimlər, səhv yazılar və multidility

Sinonimlər: 'synonym' filteri vasitəsilə fayl/siyahı yükləyin; domenləri bölün (casino/idman).
Çap səhvləri: 'fuzziness: AUTO' v 'multi _ match', uzunluğu və sahələri məhdudlaşdırın. İpuçları üçün - 'fuzzy' completion rejimi.

Çox dilli:
  • İndeks-per-lokal (tr/en/pt-BR) və ya çox analizator sxemi: 'title _ ru', 'title _ en'.
  • Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
  • «Isti» lokalları istifadəçiyə yaxın saxlamaq üçün dili marşrut açarına (routing) köçürün.

6) Filtrlər, fasetlər və aqreqasiyalar

Fasetlər üçün 'keyword' və 'nested' aqreqasiyalarından istifadə edin.
Aqreqasiyalarda kardinal sahələrdən (unikal ID) çəkinin - 'runtime fields' və ya ön vitrinlər çıxarın.

Fasetlərin nümunəsi:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Məlumatların daxil edilməsi və mətnin təmizlənməsi

Ingest pipelines: normallaşdırma, sahələrin çıxarılması, geo-encoding, HTML-in çıxarılması.
Attachment/ingest-ocr (lazım olduqda): PDF/şəkillərin indeksləşdirilməsi (PII diqqətlə).
Lemmatizasiya: analizatorlar və ya xarici paylaynlar (precompute tokenlər) vasitəsilə.


8) Şarlar, replikalar və ILM

8. 1 Ölçülər və Şardinq

Daha az şard daha yaxşıdır. Məqsəd: qarışıq yüklər üçün şard başına 10-50 GB.
'number _ of _ shards: 1-3' ilə başlayın, faktiki olaraq ölçün. Replikalar - məhsulda ən azı 1.

8. 2 ILM (Lifecycle)

hot → warm → cold → delete üçün logs/tarixi promo.
«Soyuq» seqmentlər üçün sıxılma (force merge).
Kataloqlar və məhsul axtarışları üçün - periodik optimallaşdırma ilə «limitsiz» hot.

8. 3 Downtime olmadan miqrasiya alqoritmi

Yeni 'games _ v2' → alias 'games' indeksi 'reindex' və backfill-dən sonra keçir. Deprecated sahələr - tədricən təmizləyin.


9) Snapshotlar, DR və yeniləmələr

Snapshots obyekt saxlama (S3/GCS), cədvəl və bərpa yoxlama.
Rolling yeniləmə nod, test shard allocation awareness (zonalar üzrə).
DR planları: kritik indekslər üçün cross-region replikasiya (CCR) (kataloqlar, kataloqlar).


10) Təhlükəsizlik və PII

müştəri və klaster arasında TLS/mTLS.
RBAC: indeks/əməliyyat rolları; Dev/Stage/Prod - ayrıca.
PII/PCI: lazım olmadan şəxsi məlumatlarla sahələri indeksləşdirməyin; ingest-maskalama istifadə edin.
Right to be forgotten: user_id silmək üçün sənədlərə bağlantıları saxlayın; soft-delete + reindex/anonalization.


11) Müşahidə və SLO axtarış

Metriklər:
  • query P50/P95/P99 latency, 4xx/5xx səhvləri.
  • 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 nümunələri:
  • Oyunlar axtarış: P95 ≤ 200 ms, səhvlər <0. 30-min pəncərədə 5%.
  • İpuçları: P95 ≤ 80 ms.
  • KNN hibrid: top-20 nəticələr üçün P95 ≤ 350 ms.

12) FinOps: dəyəri və performans

İndeks ölçüsü: tokenizasiya qənaət edin, lazımsız 'fielddata' söndürün, yalnız lazım olan yerdə 'doc _ values' istifadə edin.
Seqmentlər: merge siyasətini planlaşdırın, «əzilməyə» imkan verməyin.
KNN RAM/CPU daha bahalıdır: dims, 'num _ candidates', BM25-da pre-filter.
RAM-da isti sahələr: field data/heap-ı izləyin; «ağır» aqreqasiyaları ayrı-ayrı indekslərə aparın.


13) Sorğu nümunələri

13. 1 Boost ilə multipol tam mətn

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

13. 2 Filtrlər + fasetlər

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 filtrasiya atributları

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

13. 4 highlight ilə log axtarış (ECS)

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 və izolyasiya

Tenant indeksi (daha yaxşı) və ya 'tenant _ id' + ACL filtri (aqreqasiyalarda daha bahalı).
Routing 'tenant _ id' şarların lokallaşdırılması üçün.
Tenant sorğularını limitlərlə/vaxtlarla məhdudlaşdırın, 'query. phase` guard-rails.


15) Giriş çek siyahısı

1. Sxem: 'text/keyword/nested' + multipol, 'dense _ vector' lazım olduqda.
2. Avtomatik tamamlama üçün per-dil analizatorları, sinonimlər, edge-ngram.
3. Müvafiq: BM25 boosts + hibrid kNN → rescore.
4. Fasetlər: keyword/nested, yalnız «sağlam» sahələrdə aqreqasiya.
5. İndeks: ingest pipelines (normallaşma), batch-download.
6. Charding: kiçik ilə başlayın, hərəkət üçün alias, «uzun» yuvaları üçün ILM.
7. DR: snapshots cədvəli, bərpa yoxlama, kritik indekslər üçün CCR.
8. Təhlükəsizlik: TLS, RBAC, PII maskalama, silinmə siyasəti.
9. Müşahidə: latency, heap/GC, cache hit, hot shards, rejections.
10. FinOps: indeks ölçüsü, kNN parametrləşdirilməsi, artıq devre 'doc _ values/fielddata'.


16) Anti-nümunələr

Hər şey üçün bir indeks: müxtəlif domenlər (kataloq, qeydlər, əməliyyatlar) müxtəlif parametrləri tələb edir.
Düşüncəsiz 'fuzziness: AUTO' bütün sahələrdə → yavaş və səs-küylü.
«Mənanı yeyir» sinonimləri: lüğət domenlərini bölməyin.
Sahə bağları lazım olan yerdə nested yoxdur → saxta fasetlər.
Çox sayda şard (hər sənəd üçün bir) - cluster state-də əlavə xərclər.
Miqrasiya zamanı alias istifadə etməmək - fasilələr və «qırıq» bağlantılar.
PII «olduğu kimi» indeksləşdirilməsi - tənzimləyici risklər və bahalı reindeks.


17) iGaming/fintech konteksti: sürətli reseptlər

Oyunların axtarışı: 'multi _ match' ilə 'title ^ 4', 'tags ^ 2', provayder/dəyişkənliyə görə fasetlər, region/valyutaya görə filtrlər, «mövzu» üçün vektorlu hibrid (məsələn, «Misir», «fruit classic»).
Promo/bonuslar: sinonimlər («frispins», «free spins»), məlumat filtrləri 'active _ from/active _ to', completion vasitəsilə məsləhətlər.
KYC/AML jurnalları: ECS sxemi, 'message' tam mətni, 'rule _ name', 'country' aqreqasiyaları, '@timestamp' histoqramında anomaliyalar.
Provayderlərin kataloqu: faset və çeşidləmə üçün keyword sahələri; mətn təsviri - morfologiya ilə 'text'.
Tənzimləyici səhifələr: çox dilli sahələr, yumşaq ipuçları üçün 'search _ as _ you _ type'.


Yekun

Elasticsearch-də effektiv axtarış yalnız «BM25-i daxil etmək» deyil: düzgün analizatorlar və mappinqlər, multipols və nested, hibrid VM25 + vektorlar, səliqəli fasetlər və aqreqasiyalar, nizamlanma və ILM, aydın SLO və müşahidə, həmçinin təhlükəsizlik və Fin Ops. Bu prinsiplərlə axtarışınız sürətli, uyğun və proqnozlaşdırıla bilən olacaq - və məhsul platformasının trafik zirvələrinə tab gətirəcəkdir.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.