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. ტექსტი '(ანალიზი),' 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 ფასეტებისთვის

სახეობების ატრიბუტები: [{name, value}] 'შედგენა' არარსებული ", წინააღმდეგ შემთხვევაში ფასადები ცრუ დამთხვევებს მისცემს.

3) შესაბამისი: BM25, ბუში და ჰიბრიდი

3. 1 კლასიკური (BM25)

დააკავშირეთ ველები სასწორთან (title ^ 4, tags ^ 2, description).
გამოიყენეთ 'minimum _ should _ match' ხმაურიანი დამთხვევების გასაკონტროლებლად.

3. 2 ვექტორი (kNN) + BM25 (rerank)

Ambedings (მაგალითად, 384-768) in 'dense _ vector'.
ჯერ kNN ვექტორში (ტოპ 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) ავტომატური დასრულება და მინიშნებები

მიდგომები:
  • 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) სინონიმები, ტიპები და მრავალენოვანი ენები

სინონიმები: ჩამოტვირთეთ ფაილი/სია „სინონიმის“ ფილტრის საშუალებით; გაზიარეთ დომენები (კაზინო/სპორტი).
ტიპაჟები: 'fuzziness: AUTO' in 'multi _ match', შემოიფარგლეთ სიგრძით და ველებით. მინიშნებისთვის - 'fuzzy' completion რეჟიმში.

მრავალენოვანი:
  • ინდექსი-per-local (ru/en/tr/pt-BR) ან მრავალარხიანი სქემა: 'title _ ru', 'title _ en'.
  • Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
  • გადაიტანეთ ენა მარშრუტიზაციის გასაღებად, რათა შეინარჩუნოთ „ცხელი“ იდაყვის მომხმარებელთან ახლოს.

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 ყურადღებით).
ლემატიზაცია: ანალიზატორების ან გარე შეღებვის საშუალებით (ნიშნები).

8) შარდები, შენიშვნები და ILM

8. 1 ზომები და შარდინგი

ნაკლები შარდვა - უკეთესი. მიზანი: 10-50 GB საშინელებათა შერეული დატვირთვისთვის.
დაიწყეთ 'number _ of _ shards: 1-3', ფაქტობრივად მასშტაბური. რეპლიკები - მინიმუმ 1 გაყიდვაში.

8. 2 ILM (Lifecycle)

hot - warm - cold - delete dogs/პრომო ისტორიისთვის.
შეკუმშვა (force merge) „ცივი“ სეგმენტებისთვის.
კატალოგებისთვის და პროდუქტის მოსაძებნად - „შეუზღუდავი“ ცხელი პერიოდული ოპტიმიზაციით.

8. 3 მიგრაციის ალგორითმი

ახალი ინდექსი 'games _ v2' alias 'games' გადადის 'reindex' და backfill- ის შემდეგ. დეპრესიული ველი - თანდათანობით გაასუფთავეთ.

9) Snaphots, DR და განახლებები

Snapshots ობიექტის საცავში (S3/GCS), გრაფიკი და აღდგენის შემოწმება.
Nods Rolling განახლებები, shard allocation awareness- ის შემოწმება (ზონების მიხედვით).
DR გეგმები: ჯვარედინი რეგიონი (CCR) კრიტიკული ინდექსებისთვის (საცნობარო წიგნები, კატალოგები).

10) უსაფრთხოება და PII

TLS/mTLS კლიენტსა და კლასტერს შორის.
RBAC: როლები ინდექსის/ოპერაციებზე; Dev/Stage/Stage - ცალკე.
PII/PCI: არ დაადგინოთ ველები პერსონალური მონაცემებით, საჭიროების გარეშე; გამოიყენეთ ინგესტის ნიღბები.
Right to forgotten: შეინახეთ ბმულები წაშლის დოკუმენტებზე user _ id; soft-delete + reindex/ანონიზაცია.

11) დაკვირვება და ძებნა

მეტრიკა:
  • P50/P95/P99 latence 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. 5% 30 წუთის ფანჯარაში.
  • მინიშნებები: P95-80 ms.
  • KNN ჰიბრიდი: P95-350 ms ტოპ-20 შედეგისთვის.

12) FinOps: ღირებულება და შესრულება

ინდექსის ზომა: დაზოგეთ ტოქსიკაცია, გამორთეთ ზედმეტი 'fielddata', გამოიყენეთ 'doc _ values "მხოლოდ იქ, სადაც საჭიროა.
სეგმენტები: დაგეგმეთ მერჯე პოლიტიკა, ნუ დაუშვებთ „ფრაგმენტებს“.
KNN უფრო ძვირია, ვიდრე RAM/CPU: შეზღუდეთ dims, 'num _ candidates', pre filter BM25- ზე.
ცხელი ველები RAM- ში: დააკვირდით ველის მონაცემთა/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 ატრიბუტების ფილტრაცია

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 ფილტრი (უფრო ძვირია აგრეგაციებზე).
Routing 'tenant _ id' - ით ხარის ლოკალიზაციისთვის.
შეზღუდეთ ტენანტის მოთხოვნები ლიმიტებით/ტაიმაუტებით, 'query. phase` guard-rails.

15) განხორციელების სია

1. სქემა: 'text/keyword/nested' + მულტიპოლი, 'dense _ vector' საჭიროების შემთხვევაში.
2. პერ-ენის ანალიზატორები, სინონიმები, edge-ngram ავტოკორექტირებისთვის.
3. შესაბამისი: BM25 Busty + hibrid 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/fieldata'.

16) ანტი შაბლონები

ერთი ინდექსი „ყველაფრისთვის“: სხვადასხვა დომენები (კატალოგი, ლოგოები, გარიგებები) მოითხოვს სხვადასხვა პარამეტრს.
დაუფიქრებელი: AUTO ყველა სფეროში ნელა და ხმაურიანია.
სინონიმები „ჭამენ მნიშვნელობას“: არ გაიზიაროთ ლექსიკონის დომენები.
არარსებობის გარეშე, სადაც საჭიროა მინდვრების ლიგატები და ყალბი ფასეტები.
ძალიან ბევრი ხუმრობა (თითო დოკუმენტზე) არის ძვირადღირებული სახელმწიფო ხარჯები.
მიგრაციის დროს alias- ის უკმარისობა არის მარტივი და „გატეხილი“ ბმულები.
PII ინდექსირება „როგორც არის“ არის მარეგულირებელი რისკები და ძვირადღირებული რეინდექსები.

17) iGaming/fintech კონტექსტი: სწრაფი რეცეპტები

თამაშების ძებნა: 'multi _ match' ბუჩქით 'title ^ 4', 'tags ^ 2', პროვაიდერის/არასტაბილურობის ფასეტები, ფილტრები რეგიონში/ვალუტაში, ჰიბრიდი ვექტორებით „თემებისთვის“ (მაგალითად, „ეგვიპტე“, „fruit კლასიკური“).
პრომო/პრემია: სინონიმები („frispins“, „უფასო სპინები“), მონაცემთა ფილტრები 'აქტივი _ from/active _ to', მინიშნებები completion- ის საშუალებით.
KYC/AML ჟურნალები: ECS სქემა, სრული ტექსტი „მესიჯი“, აგრეგაცია 'rule _ name', 'country', ანომალიები '@ timestamp' ჰისტოგრამის მიხედვით.
პროვაიდერების ცნობარი: keyword ველები ფასეტებისა და დახარისხებისთვის; ტექსტური აღწერილობები - „ტექსტი“ მორფოლოგიით.
მარეგულირებელი გვერდები: მრავალენოვანი ველები, 'search _ as _ you _ type' რბილი რჩევებისთვის.

შედეგი

Elasticsearch- ზე ეფექტური ძებნა არ არის მხოლოდ „BM25 ჩართვა“: ეს არის სწორი ანალიზატორები და მაპინგები, მულტიპოლი და ნესტიანი, HM25 + ვექტორების ჰიბრიდი, სისუფთავე ფასადები და აგრეგატები, შარდვის დისციპლინა და ILM, მკაფიო SLO და დაკვირვება, ასევე უსაფრთხოება და FFFFFF- ს inOps. ამ პრინციპებით, თქვენი ძებნა სწრაფი, შესაბამისი და პროგნოზირებადი იქნება - და გაუძლებს სასურსათო პლატფორმის ტრაფიკის მწვერვალებს.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.