GH GambleHub

Технология және инфрақұрылым → Elasticsearch және толық мәтінді іздеу

Elasticsearch және толық мәтінді іздеу

1) Elasticsearch рөлі

Elasticsearch (ES) - агрегацияларға арналған инвертацияланған индекстер мен бағаналы құрылымдар базасында бөлінген іздестіру және талдау жүйесі. Ол:
  • Толық мәтін: релеванттылық (BM25), морфология, fuzzy/typo tolerant.
  • Фасеттер мен агрегациялар: атрибуттар бойынша жылдам қималар.
  • Гибридтік іздеу: BM25 + векторлық kNN (семантика).
  • Әзірлеу жылдамдығы: Query DSL, ingest pipelines, бай экожүйе.

iGaming/fintech үшін: ойындар/провайдерлерді іздеу, промо және ережелер, жылдам әрекет ететін фасеттер (провайдер, құбылмалылық, RTP, тіл), KYC/AML журналдары бойынша іздеу, логтар мен алгоритмдерді талдау.


2) Деректер моделі және маппингтер

2. 1 Индекс және өріс түрлері

'text' (талданатын өріс) - толық мәтін үшін.
'keyword' - нақты мәндер/агрегаттар/сұрыптау.
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
'nested' - өрістері дұрыс корреляцияланған нысандардың жиектері.
'dense _ vector' - векторлық көріністер (эмбеддингтер).

2. 2 Мультипольдік стратегия

Өрісті бірнеше түрде сақтаңыз: 'name. text '(талданатын),' name. raw` (keyword), `name. ngram '(автотолтыру үшін).

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 Фасеттер үшін Nested

'features' түрінің төлсипаттары: [{name, value}] 'nested' дегенді рәсімдеңіз, әйтпесе фасеттер жалған сәйкестік береді.


3) Релеванттылық: BM25, буст және гибрид

3. 1 Классика (BM25)

Өрістерді таразылармен біріктіріңіз (title ^ 4, tags ^ 2, description).
«Шулы» сәйкестіктерді бақылау үшін 'minimum _ should _ match' дегенді пайдаланыңыз.

3. 2 Векторлар (kNN) + BM25 (rerank)

Эмбеддингтер (мысалы, 384-768) в 'dense _ vector'.
Алдымен вектор бойынша kNN (top 200-500), содан кейін rescore BM25 + бизнес-бусталар (жаңалық, RTP, аймақтың лицензиясы).

Гибридтік сұрау үлгісі:
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) Автотолтыру және кеңестер

Тәсілдер:
  • Edge N-gram жер астындағы 'title. ngram '(жылдам, қарапайым).
  • Completion suggesters ('completion' өрісі) - жылдам кеңестер, бірақ жеке индекстеу жолы.
  • Search-as-you-type - сөз бен сөз тіркестерін бастау үшін токенизацияны біріктіреді.
Көмекші мысал:
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}

5) Синонимдер, қателер және көптілділік

Синонимдер: 'synonym' сүзгісі арқылы файлды/тізімді қотарыңыз; домендерді бөліңіз (казино/спорт).
Қателер: 'fuzziness: AUTO' v 'multi _ match', ұзындықпен және өрістермен шектеңіз. Кеңестер үшін - 'fuzzy' completion режимінде.

Көптілділік:
  • Индекс-per-локаль (ru/en/tr/pt-BR) немесе көп талдау схемасы: 'title _ ru', 'title _ en'.
  • Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
  • «Ыстық» локальдарды пайдаланушыға жақын ұстау үшін тілді маршруттау кілтіне (routing) ауыстырыңыз.

6) Сүзгілер, фасеттер және агрегациялар

Фасеттер үшін 'keyword' және 'nested' тіркесімдерін пайдаланыңыз.
Агрегаттарда түбегейлі өрістерден (бірегей ID) аулақ болыңыз - 'runtime fields' немесе алдын ала витриналарды шығарыңыз.

Фасеттер үлгісі:
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}

7) Деректерді енгізу және мәтінді тазалау

Ingest pipelines: қалыпқа келтіру, өрістерді алу, гео-энкодинг, HTML жою.
Attachment/ingest-ocr (қажет болғанда): PDF/суреттерді индекстеу (PII мұқият).
Лемматизация: анализаторлар немесе сыртқы пайплайндар (precompute токендер) арқылы.


8) Шарлар, репликалар және ILM

8. 1 Өлшемдері мен шардингі

Аз шардалар - жақсы. Мақсаты: аралас жүктемелер үшін шардқа 10-50 ГБ.
'number _ of _ shards: 1-3' -тен бастаңыз, іс жүзінде масштабтаңыз. Реплика - өнімдегі кемінде 1.

8. 2 ILM (Lifecycle)

hot → warm → cold → delete үшін логтар/промо тарихы.
«Суық» сегменттер үшін қысу (force merge).
Каталог және өнім бойынша іздеу үшін - мерзімді оңтайландырумен «мерзімсіз» hot.

8. 3 Түбіртексіз көші-қон алгоритмі

Жаңа 'games _ v2' → alias 'games' индексі 'reindex' және 'backfill' дегеннен кейін ауысады. Deprecated егіс алқаптарын біртіндеп жинаңыз.


9) Снапшоттар, DR және жаңарту

Snapshots нысанды сақтау орнына (S3/GCS), кесте және қалпына келтіруді тексеру.
Роллинг-жаңарту нод, тексеру shard allocation awareness (аймақтар бойынша).
DR жоспарлары: критикалық индекстер (анықтамалықтар, каталогтар) үшін кросс-аймақ репликациясы (CCR).


10) Қауіпсіздік және PII

Клиент пен кластер арасындағы TLS/mTLS.
RBAC: индекс/операция рөлі; Dev/Stage/Prod - бөлек.
PII/PCI: қажет болмаса, дербес деректері бар өрістерді индекстемеңіз; ingest-бүркемелеуді пайдаланыңыз.
Right to be forgotten: user_id бойынша жою үшін құжаттарға сілтемелерді сақтаңыз; soft-delete + reindex/анонализация.


11) Бақылау және SLO іздеу

Өлшемдері:
  • P50/P95/P99 latency query, қателер 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.
SLO мысалдары:
  • Ойындарды іздеу: P95 ≤ 200 мс, қателер <0. 30-минуттық терезеде 5%.
  • Кеңестер: P95 ≤ 80 мс.
  • KNN гибриді: top-20 нәтижелері үшін P95 ≤ 350 мс.

12) FinOps: құны және өнімділігі

Индекс өлшемі: токенизацияны үнемдеңіз, керексіз 'fielddata' дегенді өшіріңіз, 'doc _ values' дегенді тек қажет болған жерде пайдаланыңыз.
Сегменттер: merge саясатын жоспарлаңыз, «бөлшектеуге» жол бермеңіз.
KNN RAM/CPU бойынша қымбат: dims, 'num _ candidates', pre-filter BM25 шектеңіз.
RAM-дегі ыстық өрістер: field data/heap; «ауыр» агрегацияларды жеке индекстерге апарыңыз.


13) Сұрау салу мысалдары

13. 1 Үлдірі бар толық мәтінді мультиполды

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

13. 2 Сүзгілер + фасеттер

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 Атрибуттарды сүзгілеу

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

13. 4 Хайлайтпен логтар бойынша іздеу (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) Мульти-тенант және оқшаулау

Тенанттың индексі (жақсы) немесе 'tenant _ id' + ACL сүзгісі (агрегаттарда қымбат).
Шардтарды оқшаулау үшін 'tenant _ id' бойынша routing.
Тенанттың сұрауларын лимиттермен/таймауттармен шектеңіз, 'query. phase` guard-rails.


15) Енгізу чек-парағы

1. Сызба: 'text/keyword/nested' + мультипольдер, 'dense _ vector' қажет болған жағдайда.
2. Автотолтыруға арналған per-тіл, синонимдер, edge-ngram анализаторлары.
3. Релеванттылық: BM25 бусталар + гибрид kNN → rescore.
4. Фасеттер: keyword/nested, агрегациялар тек қана «сау» өрістер бойынша.
5. Индекстеу: ingest pipelines (қалыпқа келтіру), батч-жүктеу.
6. Шардирлеу: шағын, alias көшу үшін, ILM «ұзын» логтар үшін бастаңыз.
7. DR: snapshots кестесі, қалпына келтіру тексеру, сыни индекстер үшін CCR.
8. Қауіпсіздік: TLS, RBAC, PII бүркемелеу, жою саясаты.
9. Байқалуы: latency, heap/GC, cache hit, hot shards, rejections.
10. FinOps: индекс өлшемі, kNN параметрлеу, артық 'doc _ values/fielddata' өшіру.


16) Қарсы үлгілер

Барлығы үшін бір индекс: әртүрлі домендер (каталогтар, логтар, транзакциялар) әртүрлі баптауларды талап етеді.
Ойсыз 'fuzziness: AUTO' барлық өрістерде → баяу және шулы.
«Мағынаны жейді» деген синонимдер: сөздік домендерін ортақ пайдаланбаңыз.
Өріс байламдары қажет жерде nested жоқ → жалған фасеттер.
Тым көп шардалар (бір құжатқа бір-бірден) - cluster state үстеме шығыстары.
Көші-қон кезінде alias пайдаланбау - тоқтап қалу және «сынған» сілтемелер.
PII индекстеу «бұрынғыдай» - реттеуші тәуекелдер мен қымбат реиндекстер.


17) iGaming/финтех контексті: жылдам рецепттер

Ойындарды іздеу: 'multi _ match' '' title ^ 4 ',' tags ^ 2 ', провайдер/құбылмалылық бойынша фасеттер, өңір/валюта бойынша сүзгілер, «тақырыптар» үшін векторлары бар гибрид (мысалы, «Египет», «fruit classic»).
Промо/бонустар: синонимдер («фриспиндер», «free spins»), дата-сүзгілер 'active _ from/active _ to', completion арқылы кеңестер.
KYC/AML журналдары: ECS схемасы, 'message' бойынша толық мәтін, 'rule _ name' бойынша агрегациялар, 'country', '@timestamp' гистограммасы бойынша аномалиялар.
Провайдерлердің анықтамалығы: фасеттер мен сұрыптауға арналған keyword өрісі; мәтіндік сипаттамалар - морфологиясы бар 'text'.
Реттегіш беттер: көп тілді өрістер, жұмсақ кеңестер үшін 'search _ as _ you _ type'.


Жиынтық

Elasticsearch-те тиімді іздеу тек «BM25-ті қосу» ғана емес: бұл дұрыс талдағыштар мен маппингтер, мультипольдер мен nested, ВМ25 + гибриді, ұқыпты фасеттер мен агрегациялар, шардалау және ILM тәртібі, айқын SLO және бақылау, сондай-ақ қауіпсіздік және Fin Ops. Осы қағидаттармен сіздің іздеуіңіз жылдам, релевантты және болжамды болады - және азық-түлік платформасының трафигіне төтеп береді.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.