GH GambleHub

ფილტრაცია და სრული ტექსტური ძებნა

1) რატომ გვჭირდება საძიებო ფენა

ფილტრაცია და სრული ტექსტური ძებნა (FTS) უზრუნველყოფს მონაცემებზე სწრაფ წვდომას „მნიშვნელობით“ და არა მხოლოდ პირველადი კლავიშებით. სწორად შემუშავებული ძიების ფენა აერთიანებს:
  • მკაცრი ფილტრები (კატეგორიები, თარიღები, ფასები, დაშვების უფლებები)
  • სრული ტექსტი (ლექსიკური მატჩი და რანჟირება)
  • ფასეტები (სანავიგაციო ერთეულები)
  • ჰიბრიდული რანჟირება (BM25/TF-IDF + ვექტორული ემბედინგი)
  • საიმედო ოქმები (კურსორების მიერ პაგინაცია, TTL ტოქსინები, ჯვარედინი შარდვა)

2) არქიტექტურული სურათი

კომპონენტები:

1. Ingest/ETL - ინდექსისთვის მინდვრების ნორმალიზაცია, დედუპლიკაცია, გამდიდრება, მშენებლობა.

2. ინდექსატორი - საპირისპირო ინდექსი (ლექსემები - დოკუმენტები), სვეტების სტრუქტურები, ვექტორული ინდექსი (HNSW/IVF-PQ).

3. Query Layer არის შეკითხვის პარსერი, ფილტრების/დაშვების უფლებების გამოყენება, შარდების დამგეგმავი, k-way მერგი.

4. Ranker - BM25 + (ოპერა) LTR/Neural re-rank.

5. Serving - ქეში, კურსორები, ფასეტები, მაღალტექნოლოგია, ავტო კომპლექსი.

6. დაკვირვება - ლატენტობის მეტრიკა, თვისებები, A/B ექსპერიმენტები.

3) მონაცემთა და ინდექსის მოდელი

3. 1 ველები და ანალიზატორები

ტიპები: keyword (თანაბარი დამთხვევა), ტექსტი (ანალიზი), numeric/date/geo, vector.
ანალიზატორები: ტოკენიზაცია, ნორმალიზაცია (lowercase, Unicode NFKC), ფილტრები (გაჩერებული სიტყვები, სტემინგი/ლემატიზაცია).
მრავალენოვანი: პერ-ველი ანალიზატორები (ru, uk, en); ICU ანალიზი; ტრანსლიტერაცია; დიაკრიტიკის აღრიცხვა.

3. 2 საპირისპირო ინდექსი

სტრუქტურა: term-posting სია (docID, term freq, პოზიციები).
რანგი: BM25 (ან კლასიკური TF-IDF) საველე ბუჩქებით.

3. 3 ვექტორული ინდექსი

ტექსტის ემბედინგი (მაგალითად, 384-1024-განზომილებიანი).
ANN სტრუქტურები: HNSW, IVF-PQ, Flat (მცირე კომპლექტებისთვის).
კოსინუსის სიახლოვე/inner product; კალიბრაცია BM25- ით (ჰიბრიდი).

3. 4 ფასეტები და შეკრებები

სწრაფი სვეტების მნიშვნელობების კომპაქტური/სვეტების შენახვა.
იერარქიული ფასეტები (კატეგორია/ქვეკატეგორია).
დიაპაზონი (ფასების ბინები, თარიღები).

4) მოთხოვნები: ფილტრები + სრული ტექსტი + დახარისხება

4. 1 API კონტრაქტები (REST)

მოთხოვნა:

GET /v1/search? q = classic slots & limit = 20 & cursor =... & sort = score: desc, created _ at: desc
&filters=brand:("NetEnt","EGT"); price:[10 TO 50];published_at:[2024-01-01 TO ]
&facets=brand,year,price:range(0,10,20,50,100)
პასუხი (ფრაგმენტი):
json
{
"items": [ { "id":"...", "title":"...", "score": 12. 3, "highlight": { "content": ["..."] } } ],
"facets": { "brand": [{"value":"NetEnt","count":123},...] },
"page": { "limit":20, "has_more":true, "next_cursor":"opaque-token" }
}

4. 2 GraphQL (გამარტივებული)

graphql type Query {
search(query: String!, filter: SearchFilter, first: Int, after: String, sort: [Sort!]): SearchConnection!
}

4. 3 gRPC

proto message SearchRequest {
string query = 1;
map<string,string> filters = 2;
int32 page_size = 3;
string page_token = 4; // курсор repeated string facets = 5;
}

5) ბუნებრივი ენის დამუშავება (NLP)

ტოქსიკაცია/ნორმალიზაცია: უნიკოდი უსაფრთხოა, დეფისის/აპოსტროფების აღრიცხვა.
გაჩერებული სიტყვები: სინაზური სიები ენებზე.
Stemming vs lemmatization: ru/uk- ისთვის უკეთესია, ვიდრე ლემატიზაცია (ხარისხი> სიჩქარე).
სინონიმები: ორმხრივი/მიმართული ლექსიკონები; ლექსიკონის ვერსიები TTL- ით.
ტიპაჟები (fuzzy): Damerau-Levenshtein, რომელიც ზღუდავს მანძილს და ზუსტი დამთხვევის ბუჩქებს.
N- გრამი/edge-ngrams: ავტომობილების ნაკრებისთვის და მინიშნებებისთვის.
ტრანსლიტერაცია: „shch“ - „sh“, „kiev/kyiv“ - შესაბამისობის წესები.

6) შესაბამისობა და რანჟირება

6. 1 ძირითადი ლექსიკური ესკიზი

BM25 'k1', 'b' კოლექციის პარამეტრით.
ბუჩქები მინდვრებში (title ^ 3, tags ^ 1. 5, body^1).
სიახლე: 'score + = freshness _ booost (created _ at))'.

6. 2 ქცევითი სიგნალები

Click-through rate, dwell time, შენახვა არჩეულ (ანტი-პოზიციური ბაიასით).
დედუპლიკაცია: დოკუმენტების წებოვანი ~ იდენტური შინაარსით (MinHash/SimHash).

6. 3 Learning-to-Rank (LTR)

ფიჩი: BM25 მინდვრებში, სიგრძე, სიახლე, პოპულარობა, დამთხვევა ფრაზით, პოზიციური ტყავი.
მოდელები: LambdaMART/XGBoost; offline მეტრიკები NDCG @ k, MAP, Precision @ k; ონლაინ A/B.

6. 4 ნეირო-გადაკეთება

ორსართულიანი: ჩანაწერი (BM25/ANN) - ტოპ-N (მაგალითად, 200) - cross-encoder rerank.
ღირებულების აღრიცხვა: დროის ბიუჯეტი, fallback დატვირთვის დროს ნეირო ეტაპის გარეშე.

6. 5 ჰიბრიდული ძებნა (sparse + dense)

ან fusion (სკორების ნორმალიზაცია და თანხა), ან მრავალჯერადი ეტაპი (დენს, როგორც რერანკი).
კალიბრაცია მნიშვნელოვანია: min-max/z-score/quantile mapping.

7) ფილტრაცია, ფასეტები და წვდომა

7. 1 ფილტრები

ოპერატორები: '=', 'IN', დიაპაზონი, პრეფიქსი, geo-bounding ყუთი/geo-distance.
კომბინაციები: 'AND' ფილტრებით, 'OR' მრავალი მნიშვნელობით (ბრენდი IN...).
ტიპიური უსაფრთხოება: რიცხვითი ველები არ არის გაანალიზებული, როგორც ტექსტი.

7. 2 ფასეტები

იაფი გრაფიკი მიკერძოებულ სტრუქტურებში.
„გამოყენებული“ ფასეტები აჩვენებს დანარჩენ ვარიანტებს.

7. 3 წვდომა/მრავალ ტენანტობა

უსაფრთხოების ფილტრები ინტეგრირდება რანგამდე (წინასწარი ფილტერი).
ABAC/RBAC ველები დოკუმენტში ('tenant _ id', 'visibility', 'acl').
ხელი მოეწერა მოთხოვნის ნიშანს; მულტფილმის ტენანტით - ავტომატური 'tenant _ id' ფილტრი.

8) პაგინაცია, კურსორები და თანმიმდევრულობა

seek კურსორის პაგინაცია '(score, tie-breaker)' ან '(created _ at, id)' დროის დახარისხებისას.
გაუმჭვირვალე 'page _ token' c HMAC და TTL.
თანმიმდევრულობა: ინდექსის რეალური დრო (NRT): შეფერხება 0. 5-2 ჩანაწერსა და ხილვას შორის. ამის დოკუმენტირება SLA- ში.
ჯვარედინი ხიბლი: ადგილობრივი ძებნა - k-way merge გლობალური წესრიგის მიხედვით, პერ-დარტყმის კურსორები ტოკენში.

9) ავტომატური დასრულება და მინიშნებები

Suggesters: prefix-trie / edge-ngrams по полю `title`.
popular queries: დაწკაპუნება - პოპულარული მინიშნებები + პერსონალიზაცია (სეგმენტები).
Spell-as-you ტიპი: სწრაფი fuzzy ძებნა მანძილის შეზღუდვით „<= 1“.

REST მაგალითი:

GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]

10) ჰაილაიტები და სნიპეტები

პოზიციური ინდექსი - ფრაზების მოპოვება დამთხვევებით.
HTML ფილმის ადაპტაცია, სიგრძის ლიმიტი, მეზობელი ფრაგმენტების გაერთიანება.
snippet- ის რანგი შესაბამისი ტერმინების სიმკვრივის მიხედვით.

11) პროდუქტიულობა, ქეში და SLO

ინდექსები: ცხელი სეგმენტები მეხსიერებაში; postings კომპრესია; doc values ფასეტებისთვის.
კეში: L1 (პროცესი), L2 (Redis), ფასეტების/აგრეგატების ქეში; ინვალიდობა ინდექსის მიხედვით.
SLO: P95 <150-200 ms 'k <= 20', P99 <500 ms; წვდომა 99. 9%.
Backpressure: შემცირება 'k', გადატვირთვის დროს ნეირო ეტაპის გამორთვა.
Rate limiting API/მომხმარებლის/ტენანტის გასაღები.

12) დაკვირვება და ხარისხის მეტრიკა

ტექნეტიკა:
  • `search_latency_ms` (P50/P95/P99), `qps`, `timeouts`, `error_rate`
  • `cache_hit_ratio`, `facet_cache_hit`, `rerank_share`
  • `shard_fanout`, `merge_time_ms`, `ann_recall@k`
ხარისხი (ოფლაინი):
  • NDCG @ k, MAP, MRR, Recall @ k, Precision @ k აღინიშნება ნიმუშებზე.
ონლაინ:
  • CTR@k, sCTR (satisfied clicks), dwell time, отказ (pogostick rate).

A/B: ჩაწერეთ „guardrail“ მეტრიკა (ლატენტობა, შეცდომები) + მიზნები (NDCG proxy).

13) ტესტირება

Relevance unit tests: მოსალოდნელი მატჩების გადამოწმება მთავარ მოთხოვნებზე.
Property-based: წინააღმდეგობა ტიპების/სინონიმების/ენების მიმართ.
პაგინაცია: გვერდების საზღვარზე დუბლიკატების არარსებობა (კონტრაქტები).
უსაფრთხოება: წვდომის ფილტრები ყოველთვის გამოიყენება (თუნდაც faset-count).
ლექსიკონის რეგრესები: სინონიმების და fuzzy წესების ვერსია.

14) უსაფრთხოება და კონფიდენციალურობა

PII ველები არ არის ინდექსირებული როგორც ტექსტი; შეინახეთ ცალკე/დაშიფვრა.
შენახული წყაროს ტექსტების მინიმუმამდე შემცირება (store = false, მხოლოდ snippets ველები).
Query privacy: არ მოაწყოთ ნედლეული მოთხოვნები PII- სთან; ანონიმიზაცია/ჰაშირება.
მრავალ ჩრდილში: ინდექსების მკაცრი იზოლაცია ან სავალდებულო 'tenant _ id' ფილტრი.

15) მიგრაცია და თავსებადობა

ინდექსის სქემის ვერსია (v1-v2) ორმაგი ჩაწერით და თანდათანობით გადართვით.
ანალიზატორების თავსებადობა: ძველი ჯაჭვების შენარჩუნება ჯერ კიდევ არ არის ინდექსირებული.
სინონიმების/გაჩერებული სიტყვების ლექსიკონების როტაცია: 'ვერსია', 'activated _ at', rollback.

16) პრაქტიკული რეცეპტები

16. 1 კლასიკური ლექსიკური ძიება (BM25)

ველები: 'title ^ 3', 'tags ^ 2', 'body ^ 1'.
ანალიზატორები: სპეციფიკური ენა + ლემატიზაცია.
Fuzzy მოკლე მოთხოვნებისთვის ('<<= 3' ნიშანი), 'fuzzness = 1'.

16. 2 ჰიბრიდი sparse + dense

1. მოთხოვნის ემბედინგის ANN ძებნა (k = 200)

2. შერწყმა ტოპ 200 BM25- დან

3. კალიბრის და გაერთიანება (რეკიპროკალის რანკის ფუსიონი)

4. აიღეთ ტოპ-N (N = 20), სურვილისამებრ - rerank cross-encoder, საკმარისი ბიუჯეტით.

16. 3 კატალოგის ნავიგაცია

მკაცრი პრე ფილტერი უფლებებისთვის/ტენანტი

პოსტფილტრული ფასეტები (counts, აქტიური ფილტრების გათვალისწინებით)

დალაგება: შესაბამისი ან ბიზნეს ველის მიხედვით (ფასი/სიახლე)

17) შეკითხვის მაგალითები (ფსევდო-DSL)

ფილტრები და დახარისხება:
json
{
"query": "live casino,"
"filters": {
"country": ["EE","LV","LT"],
"license": ["MGA","UKGC"],
"launched_at": {"gte": "2023-01-01"}
},
"sort": ["_score:desc","launched_at:desc"],
"facets": ["country","license"],
"page": {"limit": 20, "cursor": "opaque"}
}
გეოპოისკი:
json
{
"query": "casino",
"geo": {"lat": 59. 437, "lon": 24. 753, "radius_km": 50}
}
მანქანის ნაკრები:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }

18) UX ნიმუშები

აქტიური ფილტრების ჩიპები + „ჩამოაგდეს ყველაფერი“.
ცარიელი შედეგები: აჩვენეთ „შეეცადეთ...“ (სინონიმები, ამოიღეთ ფილტრი).
„მინიშნებები ნულთან“: პოპულარული მოთხოვნები/კატეგორიები.
კურსორის პაგინაცია (ღილაკი „კიდევ“) და გაუთავებელი ნაკერი; გამოყენებული ფილტრების ფიქსირებული ინდიკატორი.
ინდივიდუალური კონცენტრატორები „გაითვალისწინეთ ტიპები“, „ფრაზის ზუსტი დამთხვევა“.

19) ხშირი შეცდომები და საწინააღმდეგო ნიმუშები

tie-breaker- ის არარსებობა დუბლი/ნახტომი დახარისხებისას.
ფასეტები, აქტიური ფილტრების გამოკლებით, არის „ყალბი“ ქვეყნები.
წვდომის ფილტრების გამოყენება რანგის შემდეგ.
სხვადასხვა ენის შერევა ერთი ანალიზატორის მიერ.
OFFSET/LIMIT ღრმა პაგინაცია seek კურსორის ნაცვლად.
შეუზღუდავი fuzzy - ლატენტობის აფეთქება.

20) განხორციელების შემქმნელი

1. დაადგინეთ ველები და მათი ტიპები, დანიშნეთ per-locale ანალიზატორები.
2. შეადგინეთ საპირისპირო ინდექსი + (opc.) ვექტორული ANN.
3. გააცნობიერეთ შეკითხვის პარსერი და უსაფრთხო წვდომის ფილტრები (pre-filter).
4. პარამეტრი BM25 და საველე ბუჩქები; დააკავშირეთ ფასეტები.
5. შეიყვანეთ კურსორები (opaque, HMAC, TTL) და k-way მერჯები.
6. დაამატეთ მანქანის ნაკრები, მაღალტექნოლოგიური, უსაფრთხო ფილმის ადაპტაცია.
7. მეტრიკა: ლატენტობა, NDCG @ k, CTR; ქეში L1/L2.
8. A/B ჩარჩო შესაბამისობის tuning.
9. დოკუმენტაცია SLA: NRT შეფერხება, ლიმიტის ლიმიტები, შესაბამისობის გარანტია.
10. მიგრაციის გეგმა: ინდექსის, ლექსიკონის და ანალიზატორების ვერსიები.

კარგად შემუშავებული ფილტრაციის ფენა და სრული ტექსტური ძებნა არა მხოლოდ სწრაფი ინდექსია, არამედ მკაფიო პროტოკოლის კონტრაქტი კურსორებთან, უსაფრთხოებასთან, UX- ის პროგნოზირებადი და გაზომილი შესაბამისი. ეს მიდგომა ფართოვდება ათასიდან მილიარდ დოკუმენტამდე და მხარს უჭერს როგორც კლასიკურ ლექსიკურ ძიებას, ასევე თანამედროვე ჰიბრიდულ სცენარებს ნერვული ქსელის რანგით.

Contact

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

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

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

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

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

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