Технология жана инфраструктура → Elasticsearch жана толук тексттүү издөө
Elasticsearch жана толук текст издөө
1) ролу Elasticsearch
Elasticsearch (ES) - агрегациялар үчүн тескери индекстердин жана колонка структураларынын негизинде бөлүштүрүлгөн издөө жана аналитикалык система. Ал берет:- Толук текст: тиешелүү (BM25), морфология, fuzzy/typo толеранттуу.
- Фасеттер жана агрегациялар: атрибуттар боюнча тез кесүүлөр.
- Гибриддик издөө: BM25 + вектордук kNN (семантика).
- Иштеп чыгуу ылдамдыгы: Query DSL, ingest pipelines, бай экосистема.
iGaming/fintech үчүн: оюндарды/провайдерлерди, промо жана эрежелерди, тез жооп берүүчү фасеттерди (провайдер, туруксуздук, RTP, тил), KYC/AML журналдарын издөө, логдорду жана алерттерди талдоо.
2) Маалыматтар жана Mapping модели
2. 1 Индекс жана талаа түрлөрү
'text' (талдануучу талаа) - толук текст үчүн.
'keyword' - так маанилери/агрегация/сорттоо.
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
'nested' - талаалардын туура корреляциясы бар объектилердин массивдери.
'dense _ vector' - вектордук көрүнүштөр (эмбеддинг).
2. 2 Multipol стратегиясы
Талааны бир нече түрдө сактаңыз: '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": [
"slot, slot machine => slot,"
"jackpot, super prize => jackpot"
] }
},
"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, Boost жана гибрид
3. 1 Классикалык (BM25)
Талааларды таразалар менен айкалыштыруу (title ^ 4, tags ^ 2, description).
"Минимумду _ 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": "Egyptian jackpot slots,"
"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) Auto толуктоо жана кыйытма
Ыкмалары:- 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-local (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: нормалдаштыруу, талааларды алуу, гео-encoding, 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) Snapshots, DR жана тактоо
объект сактоо Snapshots (S3/GCS), тартиби жана калыбына келтирүү текшерүү.
Rolling-Update Nod, текшерүү shard allocation awareness (зоналар боюнча).
DR пландары: кросс-аймак репликация (CCR) үчүн критикалык индекстер (колдонмолор, каталогдор).
10) Коопсуздук жана PII
кардар менен кластердин ортосунда TLS/mTLS.
RBAC: индекси/иш ролу; Dev/Stage/Prod - өзүнчө.
PII/PCI: зарылчылыгы жок жеке маалыматтар менен талааларды индекстөө эмес; Ингест-маскасын колдонуңуз.
Right to be forgotten: user_id боюнча алып салуу үчүн документтерге шилтемелерди сактоо; soft-delete + reindex/аноналдаштыруу.
11) Байкоо жана SLO издөө
Метрикасы:- query боюнча P50/P95/P99 latency, каталар 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 ms, каталар <0. 5% 30-мин терезеде.
- Кеңештер: P95 ≤ 80 ms.
- KNN гибрид: P95 ≤ жогорку 20 натыйжалары үчүн 350 ms.
12) FinOps: наркы жана аткаруу
Индекс көлөмү: токенизациялоону үнөмдөө, керексиз 'fielddata' өчүрүү, 'doc _ values' гана керек жерде колдонуу.
Сегменттер: merge саясатын пландаштыруу, "майдалоо" жол бербөө.
KNN RAM/CPU үчүн кымбатыраак: dims, 'num _ candidates', алдын ала 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": "egypt"}}],
"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 атрибуттарды чыпкалоо
json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features. name": "volatility" }},
{ "term": { "features. value": "high" }}
]
}}
}
}
}
13. 4 Издөө (ECS) менен highlight
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 чыпкасы (агрегацияларда кымбатыраак).
Routing 'tenant _ id' боюнча шарданы локалдаштыруу үчүн.
Тенанттын суроо-талаптарын лимиттер/таймауттар менен чектеңиз, 'query. phase` guard-rails.
15) Киргизүү чек-тизмеси
1. Схема: 'text/keyword/nested' + multipol, 'dense _ vector' керек болсо.
2. per-тил анализаторлор, синонимдер, edge-ngram auto толуктоо үчүн.
3. Актуалдуулук: BM25 Boost + гибрид kNN → rescore.
4. Фасеттер: keyword/nested, агрегациялар "дени сак" талааларда гана.
5. Индекстөө: ingest pipelines (нормалдаштыруу), батч-жүктөө.
6. Charding: кичинеден баштаңыз, көчүп үчүн 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/Fintech: тез Recipes
Оюндарды издөө: '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 күйгүзүү" эмес: бул туура анализаторлор жана mappings, мультипольдер жана nested, гибрид VM25 + векторлор, тыкан фасеттер жана агрегациялар, шардана жана ILM тартиби, так SLO жана байкоо, ошондой эле коопсуздук жана Fin Ops. Бул принциптер менен сиздин издөөңүз тез, актуалдуу жана алдын ала айтууга болот - жана азык-түлүк платформасынын трафигинин туу чокуларына туруштук берет.