Технология және инфрақұрылым → 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.
- Ойындарды іздеу: 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. Осы қағидаттармен сіздің іздеуіңіз жылдам, релевантты және болжамды болады - және азық-түлік платформасының трафигіне төтеп береді.