Filtrarea și căutarea integrală a textului
1) De ce aveți nevoie de un strat de căutare
Filtrarea și căutarea full-text (FTS) oferă acces rapid la date „prin înțeles”, nu doar prin chei primare. Un strat de căutare proiectat corespunzător combină:- Filtre stricte (categorii, date, prețuri, drepturi de acces)
- Text complet (meci lexical și clasament)
- Fațete (agregate pentru navigare)
- Clasament hibrid (BM25/TF-IDF + încorporări vectoriale)
- Protocoale fiabile (paginare cursor, token TTL, cross-sharding)
2) Imagine arhitecturală
Componente:1. Ingera/ETL → normalizare, deduplicare, îmbogățire, câmpuri de construcție pentru index.
2. Indexer → index invers (jetoane → documente), structuri de coloane, indice vectorial (HNSW/FIV-PQ).
3. Interogare strat → cerere parser, aplicarea de filtre/drepturi de acces, shard scheduler, k-way îmbinare.
4. Ranker → BM25 + LTR/Neural re-rank.
5. Servirea → memorie cache, cursoare, fațete, evidențiază, autocomplete.
6. Observabilitate → latență, valori de calitate, experimente A/B.
3) Modelul de date și index
3. 1 Câmpuri și analizoare
Tipuri: cuvânt cheie (chiar meci), text (analizat), numeric/data/geo, vector.
Analizoare: tokenizare, normalizare (litera mica, Unicode NFKC), filtre (stopwords, stemming/lemmatization).
Multilingvism: analizoare pe teren (ru, uk, en); Analiza ATI; transliterarea; luarea în considerare a diacriticelor.
3. 2 Indice invers (rar)
Structura: termen → lista de postare (docID, termen freq, poziții).
Clasament: BM25 (sau clasic TF-IDF) cu impulsuri de câmp.
3. 3 Indicele vectorial (dens)
Încorporări de text (de exemplu, 384-1024-dimensional).
Structuri ANN: HNSW, FIV-PQ, Flat (pentru seturi mici).
Proximitate cosinus/produs interior; calibrare BM25 (hibrid).
3. 4 Fațete și agregate
Stocarea precompută/coloană a valorilor pentru numărul rapid.
Fațete ierarhice (categorie/subcategorie).
Intervale (coșuri de preț, date).
4) Interogări: filtre + full-text + sortare
4. 1 Contracte API (REST)
Cerere:
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)
Răspuns (fragment):
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 (simplificat)
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) Procesarea limbajului natural (NLP)
Tokenizare/normalizare: contabilitate unicode-safe, cratimă/apostrof.
Stopwords: liste de personalizare în funcție de limbă.
Stemming vs lematizare: pentru ru/uk lemmatizarea este mai bună (calitate> viteză).
Sinonime: dicționare bidirecționale/direcționale; versiuni de dicționar cu TTL.
Greșeli de ortografie (fuzzy): Damerau-Levenshtein cu restricție de distanță și îmbunătățiri exacte ale meciurilor.
N-grame/edge-ngrams: pentru autocomplete și sugestii.
Transliterare: „shch” ↔ „u”, „kiiv/kiiv” - reguli de corespondență.
6) Relevanță și clasament
6. 1 Notare lexicală de bază
BM25 cu setarea „k1”, „b” prin colectare.
Stimulează pe câmpuri (titlu ^ 3, etichete ^ 1. 5, corp ^ 1).
Prospețime: 'scor + = freshness_boost (dezintegrare (created_at))'.
6. 2 Indicaţii comportamentale
Click-through rate, locuiesc timp, salvați la favorite (cu bayas anti-poziționale).
Deduplicare - Stitch împreună documente cu ~ conținut identic (MinHash/SimHash).
6. 3 Learning-to-Rank (LTR)
Caracteristici: BM25 de câmp, lungime, prospețime, popularitate, meci de frază, viteză pozițională.
Modele: LambdaMART/XGBoost; metrica offline NDCG @ k, MAP, Precision @ k; online A/B.
6. 4 Neuro-rearanjare
Doi pași: rechemare (BM25/ANN) → top-N (de exemplu, 200) → rang cross-encoder.
Contabilitatea costurilor: buget de timp, rezervă fără neuro-etapă sub sarcină.
6. 5 Căutare hibridă (rară + densă)
Fie fuziune (normalizarea vitezelor și suma), sau multi-etapă (dens ca rang).
Calibrarea este importantă: min-max/z-score/cartografiere cantitativă.
7) Filtrare, fațete și acces
7. 1 Filtre
Operatori: '=', 'IN', intervale, prefixe, caseta de geo-încadrare/geo-distanță.
Combinații: „ȘI” prin filtre, „SAU” într-un set de valori (brand IN...).
Tipul de securitate: câmpurile numerice nu sunt analizate ca text.
7. 2 Fațete
Conturi ieftine pentru structuri pre-calculate.
Fațetele „aplicate” arată fațetele post-filtru rămase.
7. 3 Acces/multi-chirie
Filtrele de securitate sunt integrate înainte de clasare (pre-filtru).
Câmpurile ABAC/RBAC din document ('chiriaş _ id',' vizibilitate ',' acl ').
Jetonul de cerere este semnat; cu multi-chiriaș - automat 'tenant _ id' filter.
8) Paginare, cursoare și consistență
Paginarea prin seek-cursor prin '(scor, tie-breaker)' sau prin '(created_at, id)' atunci când este sortată după timp.
Opac 'page _ token' cu HMAC și TTL.
Consistență: indicele aproape în timp real (NRT): întârziere 0. 5-2 s între înregistrare și vizibilitate. Documentează-l în SLA.
Cross-shard: căutare locală → k-way fuzionează prin ordine globală, cursoare per shard în token.
9) AutoComplete și solicitări
Sugestori: prefix-trie/edge-ngrams по полю 'title'.
Interogări populare: jurnal de clicuri → sfaturi despre popularitate + personalizare (segmente).
Spell-as-you-type: căutare rapidă fuzzy cu limită de distanță '<= 1'.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) Repere și fragmente
Index pozițional → recuperarea frazelor cu meciuri.
Evadarea HTML, limita de lungime, unirea fragmentelor vecine.
Clasament fragmente de densitate de termeni relevanți.
11) Performanță, cache și SLO
Indici: segmente fierbinți în memorie; postări de compresie; valorile doc pentru fațete.
Cache: L1 (proces), L2 (Redis), fațete/agregate cache; dezactivat de versiunea index.
SLO: P95 <150-200 ms la 'k <= 20', P99 <500 ms; disponibilitate 99. 9%.
Backpressure: scăderea „k”, dezactivați stadiul neuro atunci când este supraîncărcat.
Rata de limitare la API/utilizator/chiriaș cheie.
12) Măsurarea observabilității și a calității
Măsurători tehnice:- 'search _ latency _ ms' (P50/P95/P99),' qps ',' timeout ',' error _ rate '
- 'cache _ hit _ ratio', 'facet _ cache _ hit', 'rank _ sharey'
- 'shard _ fanout', 'merge _ time _ ms',' ann _ recall @ k '
- NDCG @ k, MAP, MRR, Recall @ k, Precision @ k pe eșantioane marcate.
- CTR @ k, sCTR (clicuri satisfăcute), timp de locuit, отказ (rata de pogostick).
A/B: fixați valorile „guardrail” (latență, erori) + țintă (proxy NDCG).
13) Testarea
Teste unitare relevante: verificarea meciurilor preconizate pentru solicitările cheie.
Bazat pe proprietate: rezistență la greșeli de ortografie/sinonime/limbi.
Paginare: fără duplicate la limita paginii (solicitați contracte).
Securitate: filtrele de acces sunt întotdeauna aplicate (chiar și pe faset-count).
Regresii dicționar: versioning sinonime și reguli neclare.
14) Securitate și confidențialitate
Câmpurile cu PII nu sunt indexate ca text; a se păstra separat/cripta.
Minimizați sursele stocate (store = false, doar câmpurile fragmentate).
Interogare confidențialitate: nu loga cereri brute cu PII; anonimizare/hashing.
Multi-chiriaș: izolarea strictă a indexului sau obligatoriu 'tenant _ id' filter.
15) Migrații și interoperabilitate
Schema indicelui de versionare (v1→v2) cu scriere dublă și comutare treptată.
Compatibilitate analizor: nu re-index lanțuri vechi încă.
Rotația dicționarelor sinonim/stop: 'versiune', 'activated _ at', rollback.
16) Rețete practice
16. 1 Căutare lexicală clasică (BM25)
Câmpuri: 'titlu ^ 3', 'etichete ^ 2', 'corp ^ 1'.
Analizoare: limbaj specific + lematizare.
Fuzzy pentru interogări scurte ('<= 3' tokens), 'fuzziness = 1'.
16. 2 Hibrid rare + dens
1. Căutare ANN prin încorporarea interogării (k = 200)
2. Îmbină cu top-200 BM25
3. Fuziunea rangului de calibrare
4. Ia top-N (N = 20), opțional - rang cross-encoder cu un buget suficient.
16. 3 Navigare catalog fațetat
Hard pre-filtru de drepturi/chiriaș
Fațete post-filtru (numere inclusiv filtre active)
Sortați după relevanță sau domeniu de afaceri (preț/noutate)
17) Cereri de probă (pseudo-DSL)
Filtre și sortare: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"}
}
Geopoisk:
json
{
"query": "casino",
"geo": {"lat": 59. 437, "lon": 24. 753, "radius_km": 50}
}
Completare automată:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) Modele UX
Active filtru chips-uri + "reset all'.
Rezultate goale: arată „încercați”... (sinonime, eliminați filtrul).
Zero Sugestii: interogări populare/categorii.
Paginare cursor (buton More) și defilare infinită; indicator fix al filtrelor aplicate.
Comutatoare separate „ia în considerare greșelile de ortografie”, „potrivirea exactă a frazei”.
19) Erori frecvente și anti-modele
Fără cravată la sortare → dublează/sare.
Fațete fără a lua în considerare filtrele active → numărătoarea „falsă”.
Aplicați filtre de acces post-ranking.
Amestecarea diferitelor limbi cu un singur analizor.
Paginare profundă OFFSET/LIMIT în loc de a căuta cursor.
Explozie → nelimitată prin latenţă.
20) Lista de verificare a implementării
1. Definiți câmpurile și tipurile lor, atribuiți analizoare per-local.
2. Proiectați indexul invers + (optează.) vector ANN.
3. Implementați un parser de interogare și securizați pre-filtrele.
4. Configurați BM25 și stimulează câmpul; atașați fațete.
5. Introduceţi cursoarele (opace, HMAC, TTL) şi fuzionarea k-way prin cioburi.
6. Adăugați completarea automată, evidențiază, ecranare sigură.
7. Valori: latență, NDCG @ k, CTR; L1/L2 memorie cache.
8. Cadrul A/B pentru relevanța acordării.
9. Documentul SLA: întârziere NRT, limite „limită”, garanție de coerență.
10. Planul de migrare: versiuni de index, dicționare și analizoare.
Un strat bine conceput de filtrare și căutare full-text nu este doar un index rapid, ci și un contract clar de protocol cu cursoare, securitate, UX previzibil și relevanță măsurabilă. Această abordare scalează de la mii la miliarde de documente și sprijină atât căutarea lexicală clasică, cât și scenariile hibride moderne cu rang de rețea neurală.