Տեխնոլոգիաները և ենթակառուցվածքը Elasticsearch-ը և ամբողջական տեքստային որոնումը
Elasticsearch և ամբողջական տեքստային որոնում
1) Elasticsearch դերը
Elasticsearch (ES) - բաշխված որոնման և վերլուծական համակարգ, հիմնված ինովացված ինդեքսների և հսկայական կառուցվածքների վրա ագրեգացիայի համար։ Նա տալիս է
Ամբողջական տեքստը 'ռելեվանտիզմը (BM25), մորֆոլոգիան, fuzzy/typo tolerae։
Ֆասետներ և ագրեգացիաներ 'արագ կտրվածքներ։
Ստացիոնար որոնում ՝ BM25 + վեկտորային kNN (սեմանտիկա)։
Զարգացման արագությունը ՝ Query DSL, ingest pipelines, հարուստ էկոհամակարգ։
IGaming/fintech-ի համար 'խաղերի/պրովայդերների որոնում, պրոմո և կանոններ, արագացնող ֆասետներ (պրովայդեր, անկայունություն, RTP, լեզու), որոնում KYC/AML ամսագրերով, լոգոների և ալերտների վերլուծությամբ։
2) Տվյալների և մապինգի մոդելը
2. 1 Ինդեքսը և դաշտերի տեսակները
'( վերլուծված դաշտը) - ամբողջական տեքստի համար։
«keyword» -ը ճշգրիտ արժեքներ/միավորում/տեսակավորում է։
«nested» -ը օբյեկտների զանգվածներն են, որոնք ճիշտ կապ ունեն դաշտերի հետ։
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
«dense _ vector» - վեկտորային ներկայացումներ (embeddings)։
2. 2 Մուլտիպլիկացիոն ռազմավարություն
Պահեք դաշտը մի քանի տեսակի ՝ "name. 07 '(վերլուծված), "name. raw` (keyword), `name. ng.ru "(ավտոմատացման համար)։
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: [wwww.ne, value]» տեսակի ատրիբուտները կազմեք «nested», հակառակ դեպքում ճակատները կեղծ համընկնումներ կտան։
3) Revantion: BM25, bust և հիբրիդ
3. 1 Դասական (BM25)
Կիսեք դաշտերը քաշով (title ^ 4, tags ^ 2, description)։
Օգտագործեք «minimum _ should _ match» 'աղմկոտ համընկնումների վերահսկման համար։
3. 2 վեկտորներ (kNN) + BM25 (rerank)
Էմբեդինգները (օրինակ, թիվ 4-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։ ng.ru "(արագ, պարզ)։
Completion suggesters («completion» դաշտ) - արագ հուշումներ, բայց ինդեքսավորման առանձին ճանապարհ։
Search-as-type-ը համախմբում է հյուսվածքները բառի և արտահայտությունների սկզբի համար։
Ենթադրությունների օրինակ
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}
5) Հոմանիշներ, տպագրություններ և բազմազանություն
Հոմանիշներ 'բեռնեք ֆայլը/ցուցակը' «www.nonym» ֆիլտրի միջոցով։ կիսեք ֆորումները (խաղատուն/սպորտ)։
Տպագրությունները ՝ "fuzziness: VI '" multi _ match ", սահմանափակեք երկարությունը և դաշտերը։ Հուշումների համար '«fuzzy» completion ռեժիմը։
Բազմալեզու
Ինդեքսը-per-entle (ru/en/tr/pt-III) կամ բազմանալիզատոր սխեմա ՝ «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-ի հեռացում։
Attachae/ingest-ocr (անհրաժեշտության դեպքում) 'PDF/պատկերների ինդեքսավորումը (ուշադիր PII)։
Lemmatization: Վերլուծությունների կամ արտաքին պարամետրերի միջոցով (precompronics)։
8) Շարդները, կրկնօրինակները և ILM-ը
8. 1 Չափսեր և շարդինգ
Ավելի քիչ շարդներ 'ավելի լավ։ Նպատակը 10-50 ԳԲ-ն է խառը բեռների համար։
Սկսեք «nument _ of _ shards: 1-3», մեծացրեք իրականում։ Կրկնօրինակները վաճառքում առնվազն 1 են։
8. 2 ILM (Lifecycle)
Սեղմումը (force merge) «սառը» հատվածների համար։
hot medwarm nocold nocold corporete logs/պատմություն promo.
Ածխաջրածինների և ապրանքի որոնման համար «անսահմանափակ» hot-ը պարբերական օպտիմիզացումով։
8. 3 Միգրացիայի ալգորիթմ առանց դաունթայմի
Նոր ինդեքսը 'games _ v2' www.alias 'games "անջատվում է" reindex "և backfill-ից հետո։ Deprecated դաշտը աստիճանաբար մաքրեք։
9) Դիպուկահարներ, DR և նորարարություններ
Diapshots-ը օբյեկտի (S3/GCS), պաշտպանված և վերականգնման ստուգում։
Ռոլինգ նորարարություն, shard allocation awareness (գոտիներով)։
DR պլանները 'Քրոսսի տարածաշրջանի կրկնօրինակումը (CPR) կրիտիկական ինդեքսների համար (տեղեկատուներ, կոդեր)։
10) Անվտանգություն և PII
TFC/mTSA հաճախորդի և կլաստերի միջև։
RBAC 'դերերը ինդեքսում/վիրահատության վրա։ Dev/Stage/Lenta.ru - առանձին։
PII/PCI: Մի ինդեքսավորեք դաշտերը անձնական տվյալների հետ առանց անհրաժեշտության։ օգտագործեք ingest դիմակավորում։
Right to be forgotten: Պահպանեք հղումները փաստաթղթերի համար user _ id; soft-intete + 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 ms, սխալներ <0։ Հինգ տոկոսը 30 րոպե պատուհանում։
Հուշումներ ՝ P95-80 մզ։
KNN հիբրիդ ՝ P95-350 մզ top-20 արդյունքների համար։
12) FinOps: Արժեք և արտադրողականություն
Ինդեքսի չափը 'խնայեք թունավորումը, անջատեք ավելորդ «fielddata», օգտագործեք «doc _ values» միայն այնտեղ, որտեղ պետք է։
Սեգմենտներ 'պլանավորեք մերգ քաղաքականություն, թույլ մի տվեք «կոտորել»։
KNN-ն ավելի թանկ է RAM/CPU-ով 'սահմանափակեք dims, «num _ candidates», pre-porter BM25-ում։
Տաք դաշտերը RAM-ում 'վերահսկեք field to/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 Nested ֆիլտրող ատրիբուտներ
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) Multi-tenant և մեկուսացում
Ինդեքսը tenault (ավելի լավ) կամ «tenom _ id» + ֆիլտրը ACL (ավելի թանկ է ագրեգացիաների վրա)։
Routing-ը 'tenium _ id '-ի համար ռուսական շարիդների ավելացման համար։
Սահմանափակում եք ստվերային լիմիտների/թայմաուտների, «query» հարցումները։ phase` guard-rails.
15) Ներդրման չեկի ցուցակ
1. Սխեմա ՝ «07/keyword/nested» +, «dense _ vector» անհրաժեշտության դեպքում։
2. Per-լեզվի վերլուծողները, հոմանիշները, edge-ng.ru ինքնաբերաբար։
3. Ռելեվանտություն ՝ BM25 բուստեր + kNN represcore հիբրիդ։
4. Ֆասետներ ՝ keyword/nested, միավորումները միայն առողջ։
5. Ինդեքսավորում ՝ ingest pipelines (նորմալացում), բատչ բեռնումը։
6. Շարդինգը 'սկսեք փոքր, alias տեղափոխման համար, ILM-ը «երկար» լոգարանների համար։
7. DR: wwww.apshots .ru, վերականգնման ստուգում, CSR կրիտիկական ինդեքսների համար։
8. Անվտանգություն ՝ TFC, RBAC, PII դիմակավորում, ռուսական քաղաքականություն։
9. Դիտարկումը 'latency, heap/GC, cache hit, hot shards, rejections։
10. FinOps: ինդեքսի չափը, kNN-ը, ավելորդ «doc _ values/fielddata» անջատումը։
16) Anti-patterna
Մեկ ինդեքսը «ամեն ինչի վրա», տարբեր օրինագծեր (կատալոգներ, լոգներ, գործարքներ) պահանջում են տարբեր պայմանագրեր։
Անխոհեմ «fuzziness: III» -ը բոլոր դաշտերում դանդաղ և աղմկոտ է։
Հոմանիշները «իմաստը ուտում են» ՝ մի բաժանել բառարանների օրինակները։
Առանց nested այնտեղ, որտեղ անհրաժեշտ են դաշտերի կապեր կեղծ ֆասետներ։
Չափազանց շատ շարդներ (մեկ փաստաթղթի վրա) - cluster state-ի ծախսեր։
Alias-ի չօգտագործումը միգրացիայի ժամանակ 'պարզ և «բիթանոց» հղումներ։
PII ինդեքսավորումը «ինչպես կա» կարգավորող ռիսկեր և թանկ ռինդեքսներ։
17) iGaming/fintech կոնտեքստը 'արագ բաղադրատոմսեր
Խաղերի որոնումը '«multi _ match»' bust 'title ^ 4', «tags ^ 2», պրովայդերի/վոլատիլիզմի ֆասետներ, ֆիլտրեր տարածաշրջանում/108, վեկտորների հետ «թեմատիկայի» համար (օրինակ ՝ «Եգիպտոս», «fruit classic»)։
Պրոմո/բոնուսներ 'հոմանիշներ («ֆրիպիններ», «free spins»), «action _ from/action _ to», հուշումներ completion միջոցով։
KYC/AML ամսագրերը ՝ ECS-սխեմա, ամբողջական տեքստ '«name», «country», անոմալիաներ' @ timestamp 'histogram։
Պրովայդերների տեղեկատու 'keyword դաշտեր ճակատների և տեսակավորման համար։ տեքստային նկարագրությունները '«07» մորֆոլոգիայի հետ։
Կարգավորող էջեր ՝ բազմալեզու դաշտեր, «search _ as _ _ type» փափուկ հուշումների համար։
Արդյունքը
Նախնական որոնումը Elasticsearch-ում ոչ միայն «միացրեք BM25» -ը 'սրանք ճիշտ վերլուծողներ և mapings, multipole և nested, WM25 + վեկտորներ, կոկիկ ֆասետներ և ագրեգացիաներ, շարդինգի կարգապահություն և ILM, պարզ SLO և դիտողականություն, ինչպես նաև անվտանգությունն ու անվտանգությունն ու ՖInops. Այս հոդվածներով ձեր որոնումը կլինի արագ, ռևլանտային և կանխատեսելի, և կհանգեցնի ռուսական սննդի պլատֆորմի պիկի։