Сүзгілеу және толық мәтінді іздеу
1) Не үшін іздеу қабаты қажет
Сүзгілеу және толық мәтінді іздеу (FTS) тек бастапқы кілттер бойынша ғана емес, «мағынасы бойынша» деректерге жылдам қатынауды қамтамасыз етеді. Дұрыс жобаланған іздеу қабаты:- Қатаң сүзгілер (санаттар, күндер, бағалар, қол жеткізу құқықтары)
- Толық мәтін (лексикалық матч және саралау)
- Фасеттер (навигацияға арналған агрегаттар)
- Гибридтік ранжирлеу (BM25/TF-IDF + векторлық эмбеддингтер)
- Сенімді хаттамалар (курсорлармен пагинация, TTL токендер, кросс-шардинг)
2) Сәулет көрінісі
Компоненттер:1. Ingest/ETL → қалыпқа келтіру, дедупликациялау, байыту, индекс үшін өріс құру.
2. Индекс → кері индекс (лексемалар → құжаттар), бағаналық құрылымдар, векторлық индекс (HNSW/IVF-PQ).
3. Query Layer → сұрау парсері, сүзгілерді/рұқсаттарды қолдану, шард жоспарлаушы, k-way merge.
4. Ranker → BM25 + (опц.) LTR/Neural re-rank.
5. Serving → кэш, курсор, фасет, хайлайт, автокомплит.
6. Бақылау → латенттілік, сапа метрикасы, A/B-эксперименттер.
3) Деректер мен индекстің моделі
3. 1 Өрістер мен талдағыштар
Түрлері: keyword (тегіс сәйкестік), text (талданады), numeric/date/geo, vector.
Талдағыштар: токенизация, қалыпқа келтіру (lowercase, Unicode NFKC), сүзгілер (стоп-сөздер, стемминг/лемматизация).
Көп тілділігі: per-field анализаторлар (ru, uk, en); ICU-талдау; транслитерация; диакритиканы есепке алу.
3. 2 Кері индекс (sparse)
Құрылымы: term → posting list (docID, term freq, позициялар).
Ранжирлеу: далалық бустері бар BM25 (немесе классикалық TF-IDF).
3. 3 Векторлық индексі (dense)
Мәтін эмбеддингі (мысалы, 384-1024-өлшемді).
ANN-құрылымдар: HNSW, IVF-PQ, Flat (шағын жиынтықтар үшін).
Косинустық жақындығы/inner product; BM25 (гибридпен) калибрлеу.
3. 4 Фасеттер мен агрегаттар
Тез count-тер үшін мәндерді прекомпьют/бағаналы сақтау.
Иерархиялық фасеттер (санат/кіші санат).
Диапазондар (бағалық биндер, күндер).
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)
Токенизация/қалыпқа келтіру: Unicode-қауіпсіз, дефистерді/апострофтарды есепке алу.
Тоқтату сөздері: тілдер бойынша баптау тізімдері.
Stemming vs лемматизация: ru/uk үшін жақсы лемматизация (сапа> жылдамдық).
Синонимдер: екі бағытты/бағытталған сөздіктер; TTL сөздіктерінің нұсқалары.
Қателер (fuzzy): Damerau-Levenshtein арақашықтығы шектелген және дәл сәйкес келетін бустері бар.
N-грамдары/edge-ngrams: автокомплит және кеңестер үшін.
Транслитерация: «shch», «щ», «kiev/kyiv» - сәйкестік ережелері.
6) Релеванттылық және ранжирлеу
6. 1 Базалық лексикалық скоринг
BM25 'k1', 'b' баптаулары бар.
Өрістер бойынша бусталар (title ^ 3, tags ^ 1. 5, body^1).
Жаңалық: 'score + = freshness_boost (decay (created_at))'.
6. 2 Мінез-құлық сигналдары
Click-through rate, dwell time, таңдаулы сақтау (анти-позициялық байаспен).
Дедупликация: ~ бірдей мазмұны бар құжаттарды жапсыру (MinHash/SimHash).
6. 3 Learning-to-Rank (LTR)
Фичи: BM25, ұзындығы, ашықтығы, танымалдығы, сөз тіркесі бойынша сәйкестігі, позициялық жылдамдығы.
Модельдері: LambdaMART/XGBoost; NDCG @k, MAP, Precision @k офлайн-метриктері; A/B онлайн
6. 4 Нейрореанжирлеу
Екі кезең: recall (BM25/ANN) → top-N (мысалы, 200) → cross-encoder rerank.
Құнын есепке алу: жүктеме кезінде нейро-кезеңсіз тайм-бюджет, fallback.
6. 5 Гибридті іздеу (sparse + dense)
Не fusion (жылдамдықты қалыпқа келтіру және сома), не multi-stage (dense rerank ретінде).
Калибрлеу маңызды: min-max/z-score/quantile mapping.
7) Сүзу, фасеттер және қол жетімділік
7. 1 Сүзгілер
Операторлар: '=', 'IN', ауқымдар, префикстер, geo-bounding box/geo-distance.
Сүзгілер бойынша 'AND', көптеген мәндердің ішінде 'OR' комбинациялары (brand IN...).
Типтік қауіпсіздік: сандық өрістер мәтін ретінде талданбайды.
7. 2 Фасеттер
Алдын ала есептелген құрылымдар бойынша арзан count-тер.
«Қолданылған» фасеттер қалған нұсқаларын көрсетеді (post-filter faceting).
7. 3 Қолжетімділік/көп теңгерімділік
Қауіпсіздік сүзгілері ранжирлеуге дейін біріктіріледі (pre-filter).
Құжаттағы өрістердің ABAC/RBAC ('tenant _ id', 'visibility', 'acl').
Сұрау салудың белгісіне қол қойылды; мульти-тенантта - автоматты 'tenant _ id' сүзгісі.
8) Пагинация, курсорлар және консистенттілік
Уақыт бойынша сұрыптау кезінде '(score, tie-breaker) немесе' (created_at, id) 'бойынша seek-курсормен пагинация.
Мөлдір емес 'page _ token' c HMAC және TTL.
Индекстің консистенттілігі: near-real-time (NRT): кідіріс 0. 5-2 жазу мен көріну арасында. Оны SLA бағдарламасында құжаттаңыз.
Кросс-шард: жергілікті іздеу → жаһандық тәртіп бойынша k-way merge, токендегі per-shard курсорлары.
9) Автотолтыру және кеңестер
Suggesters: prefix-trie / edge-ngrams по полю `title`.
Popular queries: лог клик → танымалдығы бойынша кеңестер + дербестендіру (сегменттер).
Spell-as-you-type: қашықтық шектелген fuzzy-іздеу жылдамдығы '<= 1'.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) Хайлайттар мен сниппеттер
Позиция индексі → Сәйкестік тіркестерін алу.
HTML экрандау, ұзындық шегі, көршілес үзінділерді біріктіру.
Релевантты терминдердің тығыздығы бойынша сниппеттерді ранжирлеу.
11) Өнімділік, кэш және SLO
Индекстер: жадтағы ыстық сегменттер; компрессия postings; фасеттер үшін doc values.
Кэш: L1 (процесс), L2 (Redis), фасеттер/агрегаттар кэші; индекс нұсқасы бойынша мүгедектікке жіберу.
SLO: P95 <150-200 мс кезінде 'k <= 20', P99 <500 мс; қол жетімділік 99. 9%.
Backpressure: 'k' азаю, шамадан тыс жүктеме кезінде нейро-кезеңді ажырату.
API/пайдаланушы/тенант кілтіне Rate limiting.
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 прокси) белгілеңіз.
13) Тестілеу
Relevance unit tests: негізгі сұраулар бойынша күтілетін матчтарды тексеру.
Property-based: қателерге/синонимдерге/тілдерге төзімділік.
Пагинация: парақтар шекарасында телнұсқалардың болмауы (seek-келісімшарттар).
Қауіпсіздік: Қатынас сүзгілері әрқашан қолданылады (тіпті faset-count).
Сөздік регрестері: синонимдер мен fuzzy-ережелерді нұсқалау.
14) Қауіпсіздік және құпиялылық
PII өрістері text ретінде индекстелмейді; жеке сақтау/шифрлау.
Сақталған бастапқы мәтіндерді барынша азайту (store = false, тек snippet өрістері).
Query privacy: PII бар шикі сұрауларға логин жасамау; анонимдеу/хэштеу.
Мульти-тенант: индекстерді қатаң оқшаулау немесе міндетті 'tenant _ id' сүзгісі.
15) Көші-қон және үйлесімділік
Индекс схемасын (v1 → v2) екі рет жазумен және біртіндеп ауыстырып қосумен нұсқалау.
Талдағыштардың үйлесімділігі: ескі тізбектерді әлі қайта индекстемеңіз.
'version', 'activated _ at', rollback.
16) Практикалық рецептілер
16. 1 Классикалық лексикалық іздеу (BM25)
Өрістер: 'title ^ 3', 'tags ^ 2', 'body ^ 1'.
Талдағыштар: ерекше тіл + лемматизация.
Fuzzy қысқа сұрау үшін ('<= 3' белгілер), 'fuzziness = 1'.
16. 2 sparse + dense буданы
1. Сұрау эмбеддингі бойынша ANN-іздеу (k = 200)
2. Top-200 BM25 біріктіру
3. Калибрлеу және төгу (Reciprocal Rank Fusion)
4. Top-N (N = 20) алу, жеткілікті бюджет болған кезде - rerank cross-encoderom.
16. 3 Каталогтың фасеттік навигациясы
Құқықтар/теңге бойынша қатты pre-filter
Сүзгіден кейінгі фасеттер (белсенді сүзгілерді есепке алғандағы 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 болмауы.
Белсенді сүзгілерсіз фасеттер → «жалған» counts.
Ранжирлеуден кейін қол жеткізу сүзгілерін қолдану.
Бір талдағышпен әртүрлі тілдерді араластыру.
Seek-курсор орнына OFFSET/LIMIT терең пагинациясы.
Шектелмеген fuzzy → жасырын жарылыс.
20) Енгізу чеклисті
1. Өрістерді және олардың түрлерін анықтаңыз, per-locale талдағыштарын белгілеңіз.
2. Кері + индексін жобалаңыз (опц.) векторлық ANN.
3. Сұрау парсерін және қауіпсіз кіру сүзгілерін (pre-filter) іске асырыңыз.
4. BM25 мен далалық бустерді теңшеңіз; фасеттерді қосыңыз.
5. Құралдар бойынша (opaque, HMAC, TTL) және k-way merge меңзерлерін енгізіңіз.
6. Автоматты жиынтық, хайлайт, қауіпсіз экрандау қосыңыз.
7. Метриктер: жасырындылық, NDCG @k, CTR; кэш L1/L2.
8. Релеванттылық тюнингі үшін A/B-фреймворк.
9. SLA құжаттаңыз: NRT-кідірісі, «limit» лимиттері, тұрақтылық кепілдігі.
10. Көші-қон жоспары: индекстің, сөздіктердің және талдағыштардың нұсқалары.
Жақсы жобаланған сүзгілеу және толық мәтінді іздеу қабаты - бұл жылдам индекс қана емес, сонымен қатар курстар, қауіпсіздік, болжамды UX және өлшенетін релеванттылықпен нақты хаттамалық келісімшарт. Мұндай тәсіл мыңдаған құжаттан миллиардқа дейін масштабталады және классикалық лексикалық іздеуді, сондай-ақ нейрожелілік ранжирлеу бар заманауи гибридтік сценарийлерді қолдайды.