GH GambleHub

Teknoloji ve Altyapı - Elasticsearch ve Tam Metin Arama

Elasticsearch ve Tam Metin Arama

1) Elasticsearch rolü

Elasticsearch (ES), toplamalar için ters endekslere ve sütun yapılarına dayanan dağıtılmış bir arama ve analiz sistemidir. Veriyor:
  • Tam metin: alaka düzeyi (BM25), morfoloji, bulanık/daktilo toleranslı.
  • Fasetler ve toplamalar: niteliklere göre hızlı dilimler.
  • Karma arama: BM25 + vektör kNN (anlambilim).
  • Geliştirme hızı: Sorgu DSL, yutmak boru hatları, zengin ekosistem.

IGaming/fintech için: oyunları/sağlayıcıları, tanıtımları ve kuralları, hızlı tepki veren yönleri (sağlayıcı, volatilite, RTP, dil) arayın, KYC/AML dergilerini arayın, günlükleri ve uyarıları ayrıştırın.


2) Veri modeli ve eşlemeler

2. 1 Alan indeksi ve türleri

Tam metin için 'text'.
'kedword' - tam değerler/toplamalar/sıralama.
'tarih', 'uzun/çift', 'boolean', 'ip', 'geo _ point'.
'İç içe' - doğru alan korelasyonuna sahip nesne dizileri.
'dense _ vector' - vektör temsilleri (gömmeler).

2. 2 Çok alanlı strateji

Alanı birkaç görünümde saklayın: 'name. metin ',' isim. raw '(anahtar kelime),' isim. ngram '(otomatik tamamlama için).

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 Fasetler için iç içe

'Features: [{name, value}]' design 'nested' formunun nitelikleri, aksi takdirde fasetler yanlış eşleşme verir.


3) Alaka düzeyi: BM25, boost ve hibrit

3. 1 Klasikler (BM25)

Alanları ağırlıklarla birleştirin (başlık ^ 4, etiketler ^ 2, açıklama).
Gürültülü eşleşmeleri kontrol etmek için 'minimum _ should _ match' kullanın.

3. 2 Vektörler (kNN) + BM25 (rerank)

Gömmeler (örn. 384-768) içinde 'yoğun _ vektör'.
Önce vektörle kNN (üst 200-500), daha sonra BM25 + iş artırmalarını yeniden düzenleyin (yenilik, RTP, bölge lisansı).

Hibrit sorgu örneği:
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) Otomatik tamamlama ve istemler

Yaklaşımlar:
  • Kenar N-gram alt alanın başlığında. ngram '(hızlı, basit).
  • Tamamlama önericileri ('tamamlama' alanı) - hızlı ipuçları, ancak ayrı bir indeksleme yolu.
  • Search-as-you-type - kelimeleri ve cümleleri başlatmak için tokenizasyonu birleştirir.
Örnek istemler:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Eşanlamlılar, yazım hataları ve çok dillilik

Eşanlamlılar: dosyayı/listeyi 'eşanlamlı' filtreden yükleyin; Ayrı etki alanları (casino/spor).
Yazım hataları: 'fuzziness: AUTO' içinde 'multi _ match', uzunluk ve alanlarla sınırlıdır. Komut istemleri için - 'bulanık' tamamlama modu.

Çok dillilik:
  • Index-per-locale (ru/en/tr/pt-BR) veya çoklu analizör devresi: 'title _ ru', 'title _ en'.
  • Разные analizörleri: 'rus', 'İngilizce', 'Türkçe', 'Portekizce'.
  • Sıcak yerelleri kullanıcıya daha yakın tutmak için dili yönlendirme tuşuna taşıyın.

6) Filtreler, fasetler ve toplamalar

Fasetler için 'anahtar kelime've' iç içe 'toplama kullanın.
Toplamalarda ana alanlardan (benzersiz kimlikler) kaçının - bunları 'zaman alanlarına' veya ön pencerelere getirin.

Örnek fasetler:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Veri girişi ve metin temizleme

Ingest boru hatları: normalleştirme, alan çıkarma, coğrafi kodlama, HTML silme.
Ek/ingest-ocr (gerektiği gibi): PDF/görüntü indeksleme (PII'ye dikkat edin).
Lemmatizasyon: analizörler veya harici boru hatları (ön hesaplama belirteçleri) aracılığıyla.


8) Parçalar, kopyalar ve ILM

8. 1 Boyutlar ve Sharding

Daha az parça daha iyidir. Hedef: Karışık yükler için parça başına 10-50GB.
'Number _ of _ shards: 1-3'ile başlayın, aslında ölçeklendirin. Replikalar - satışlarda en az 1.

8. 2 ILM (Yaşam Döngüsü)

Sıcak - sıcak - soğuk - günlükler/geçmiş promosyonu için sil.
Soğuk bölümler için zorla birleştirme.
Kataloglar ve ürün arama için - periyodik optimizasyon ile "sürekli" sıcak.

8. 3 Kesinti süresiz geçiş algoritması

Yeni dizin 'games _ v2' - takma adı 'games', 'reindex've backfill'den sonra geçer. Depresif alanlar - yavaş yavaş kaldırın.


9) Anlık görüntüler, DR ve güncellemeler

Nesne depolama (S3/GCS), zamanlama ve geri yükleme denetimine anlık görüntüler.
Düğümlerin yuvarlanma güncellemeleri, parça ayırma farkındalığını kontrol etme (bölgelere göre).
DR planları: kritik dizinler (dizinler, dizinler) için bölgeler arası çoğaltma (CCR).


10) Güvenlik ve PII

İstemci ve küme arasında TLS/mTLS.
RBAC: indeks/işlem başına düşen roller; Dev/Sahne/Prod - ayrı ayrı.
PII/PCI: alanları gereksiz yere kişisel verilerle indekslemeyin; Yutmak maskeleme kullanın.
Unutulma hakkı: user_id tarafından silinmek üzere belgelere bağlantılar tutmak; soft-delete + reindex/announcement.


11) Gözlemlenebilirlik ve arama SLO

Metrikler:
  • Sorgulamaya P50/P95/P99 gecikme, 4xx/5xx hataları.
  • Önbellek isabeti (sorgu önbelleği/parça isteği önbelleği).
  • Yığın kullanımı, GC паузы, segment birleştirme, threadpools (arama/yazma).
  • Sıcak parçalar/sıcak düğümler, reddetmeler.
  • KNN: 'graph _ hits', 'search _ k', latency, recall @ k.
SLO örnekleri:
  • Oyun arama: P95 ≤ 200 ms, hatalar <0. 30 dakikalık pencerede %5.
  • İpuçları: P95 ≤ 80 ms.
  • KNN hybrid: İlk 20 sonuç için P95 ≤ 350ms.

12) FinOps: maliyet ve performans

Dizin boyutu: belirtmeyi kaydet, gereksiz 'fielddata'yı devre dışı bırak,' doc _ values 'kullan sadece gerektiğinde.
Segmentler: birleştirme politikasını planlayın, "bölünmeye" izin vermeyin.
KNN RAM/CPU'da daha pahalıdır: limit dims, 'num _ candidates', BM25 ön filtresi.
RAM'deki sıcak alanlar: monitör alan verileri/yığın; "Ağır" toplamaları ayrı endekslere ayırın.


13) Örnek istekleri

13. 1 Artırılmış çok alanlı tam metin

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

13. 2 Filtreler + fasetler

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 İç içe nitelik filtreleme

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

13. Vurgu ile 4 Günlük Arama (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) Çok kiracı ve izolasyon

Kiracıya indeks (daha iyi) veya alan 'tenant _ id' + ACL filtresi (toplamalarda daha pahalı).
Parçaları yerelleştirmek için 'tenant _ id'ile yönlendirme.
Kiracı isteklerini limitlerle/zaman aşımlarıyla sınırla, 'sorgusu. Faz 'koruma rayları.


15) Uygulama kontrol listesi

1. Şema: 'text/keyword/nested' + multi-fields, gerekirse'dense _ vector '.
2. Dil başına analizörler, eşanlamlılar, otomatik tamamlama için kenar-ngram.
3. Alaka düzeyi: BM25 + hibrid kNN + rescore artırır.
4. Facets: anahtar kelime/iç içe, yalnızca "sağlıklı" alanlar için toplama.
5. İndeksleme: yutulan boru hatları (normalleştirme), toplu yükleme.
6. Sharding: start small, alias for moving, ILM for "long" logs.
7. DR: anlık görüntüler zamanlaması, kurtarma kontrolü, kritik indeksler için CCR.
8. Güvenlik: TLS, RBAC, PII maskeleme, silme politikası.
9. Gözlemlenebilirlik: gecikme, yığın/GC, önbellek isabeti, sıcak parçalar, reddetmeler.
10. FinOps: dizin boyutu, kNN parametrelendirmesi, ekstra 'doc _ values/fielddata'yı devre dışı bırakma.


16) Anti-desenler

"Herkes için'bir dizin: farklı etki alanları (dizin, günlükler, işlemler) farklı ayarlar gerektirir.
Düşüncesiz 'bulanıklık: AUTO' - her alanda yavaş ve gürültülü.
Eş anlamlı kelimeler "meaning up eat up": Sözlük alanlarını ayırmaz.
Alan demetleri iç içe olmadan - yanlış fasetler gereklidir.
Çok fazla parça (belge başına bir tane) - küme durumu yükü.
Geçişler sırasında takma ad kullanılmaması - kesinti ve kopuk bağlantılar.
PII endeksleme "olduğu gibi" - düzenleyici riskler ve pahalı reindeksler.


17) iGaming bağlamı/fintech: Hızlı tarifler

Oyunları arayın: 'multi _ match', 'title ^ 4', 'tags ^ 2', sağlayıcıya/volatiliteye göre özellikler, bölgeye/para birimine göre filtreler, "konular" için vektörlerle melez (örneğin, "Mısır", "meyve klasiği").
Promosyon/bonuslar: eşanlamlılar ("freespins", "free spins"), veri filtreleri 'active _ from/active _ to', tamamlanma yoluyla ipuçları.
KYC/AML günlükleri: ECS şeması, 'mesaj'ile tam metin,' rule _ name ',' ülke'ile toplamalar, '@ timestamp' histogramı ile anomaliler.
Sağlayıcı dizini: fasetler ve sıralar için anahtar kelime alanları; Metin açıklamaları - morfoloji ile 'metin'.
Düzenleyici sayfalar: çok dilli alanlar, yumuşak ipuçları için 'search _ as _ you _ type'.


Sonuç

Elasticsearch'te etkili arama sadece "BM25'i açmak'değil: bunlar doğru analizörler ve haritalamalar, çok alanlı ve iç içe geçmiş, BM25 + vektörlerin bir melezi, düzgün fasetler ve agregasyonlar, sharding ve ILM disiplini, net SLO'lar ve gözlemlenebilirlik, ayrıca güvenlik ve FinOps. Bu ilkelerle, aramanız hızlı, alakalı ve öngörülebilir olacak ve ürün platformu trafiğindeki zirvelere dayanacaktır.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.