Filtrowanie i wyszukiwanie pełnych tekstów
1) Dlaczego potrzebujesz warstwy wyszukiwania
Filtrowanie i wyszukiwanie pełnego tekstu (FTS) zapewnia szybki dostęp do danych „przez znaczenie”, a nie tylko przez podstawowe klucze. Odpowiednio zaprojektowana warstwa wyszukiwania łączy w sobie:- Filtry ścisłe (kategorie, daty, ceny, prawa dostępu)
- Pełny tekst (leksykalny mecz i ranking)
- Fasety (kruszywa nawigacyjne)
- Ranking hybrydowy (BM25/TF-IDF + osadzanie wektorów)
- Niezawodne protokoły (paginacja kursora, token TTL, krzyżowanie)
2) Obraz architektoniczny
Komponenty:1. Ingest/ETL → normalizacja, deduplicacja, wzbogacanie, budowanie pól dla indeksu.
2. Indekser → indeks odwrotny (żetony → dokumenty), struktury kolumn, indeks wektorów (HNSW/IVF-PQ).
3. Query Layer → request parser, zastosowanie filtrów/praw dostępu, scheduler shard, k-way merge.
4. Ranker → BM25 + LTR/Neural re-rank.
5. Obsługa → pamięć podręczna, kursory, fakty, wyróżnienia, autokomplete.
6. Obserwowalność → opóźnienie, wskaźniki jakości, eksperymenty A/B.
3) Model danych i indeksu
3. 1 Pola i analizatory
Typy: słowo kluczowe (nawet dopasowanie), tekst (analizowane), numeryczne/data/geo, wektor.
Analizatory: tokenizacja, normalizacja (niska wartość, Unicode NFKC), filtry (stopy, stemming/lemmatyzacja).
Wielojęzyczność: analizatory na pole (ru, uk, en); Analiza OIOM; transliteracja; rozważenie diakrytyków.
3. 2 Wskaźnik odwrotny (sparse)
Struktura: termin → lista postingowa (docID, termin freq, pozycje).
Ranking: BM25 (lub klasyczny TF-IDF) z podniesieniami pola.
3. 3 Indeks wektorowy (gęsty)
Osadzenia tekstowe (na przykład 384-1024-wymiarowe).
Konstrukcje ANN: HNSW, IVF-PQ, płaskie (dla małych zestawów).
Bliskość cosinus/produkt wewnętrzny; kalibracja BM25 (hybrydowa).
3. 4 Fasety i kruszywa
Prekomputer/kolumna przechowywania wartości dla szybkich liczb.
Aspekty hierarchiczne (kategoria/podkategoria).
Zakresy (kosze cenowe, daty).
4) Zapytania: filtry + pełny tekst + sort
4. 1 Umowy API (ODPOCZYNEK)
Żądanie:
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)
Odpowiedź (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 (uproszczony)
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) Przetwarzanie języka naturalnego (NLP)
Tokenizacja/normalizacja: Unicode-safe, hyphen/apostrophe accounting.
Stopwords: listy dostosowawcze według języka.
Stemming vs lemmatyzacja: dla ru/uk lemmatyzacja jest lepsza (jakość> prędkość).
Synonimy: dwukierunkowe/kierunkowe słowniki; wersje słownikowe z TTL.
Typos (fuzzy): Damerau-Levenshtein z ograniczeniem odległości i dokładnymi zwiększeniami meczu.
N-gramów/krawędzi-ngramy: dla autokompletów i wskazówek.
Transliteracja: „shch” „u”, „kyiv/kyiv” - zasady korespondencji.
6) Znaczenie i ranking
6. 1 Podstawowe leksykalne punktowanie
BM25 z ustawieniem 'k1', 'b' przez kolekcję.
Zwiększa się o pola (tytuł ^ 3, tagi ^ 1. 5, ciało ^ 1).
Świeżość: 'wynik + = freshness_boost (próchnica (created_at))'.
6. 2 Wskazówki behawioralne
Kliknij-przez szybkość, czas mieszkania, zapisz do ulubionych (z bagnami anty-pozycyjnymi).
Deduplikacja - Ścieganie wraz z dokumentami z treścią ~ identyczną (MinHash/SimHash).
6. 3 Learning-to-Rank (LTR)
Cechy: BM25 pola, długość, świeżość, popularność, dopasowanie według frazy, prędkość pozycyjna.
Modele: LambdaMART/XGBoost; mierniki offline NDCG @ k, MAP, Precision @ k; Online A/B.
6. 4 Neuro-przegrupowanie
Two-step: recall (BM25/ANN) → top-N (na przykład, 200) → cross-encoder rerank.
Rachunkowość kosztów: budżet czasu, awaria bez neuro-etapu pod obciążeniem.
6. 5 Wyszukiwanie hybrydowe (sparse + gęste)
Albo synteza (normalizacja prędkości i sumy), albo wielostopniowe (gęste jak rerank).
Kalibracja jest ważna: min-max/z-score/mapowanie ilościowe.
7) Filtrowanie, fasony i dostęp
7. 1 Filtry
Operatorzy: '=', 'IN', zakresy, prefiksy, pudełko/odległość geograficzna.
Kombinacje: 'AND' przez filtry, 'OR' w ramach zestawu wartości (marka IN...).
Zabezpieczenie typu: pola numeryczne nie są zapisywane jako tekst.
7. 2 Aspekty
Tanie liczby dla wstępnie obliczonych struktur.
„Zastosowane” fasony pokazują pozostałe fasony po filtrze.
7. 3 Dostęp/wielopoziomowość
Filtry zabezpieczeń są zintegrowane przed rankingiem (filtr wstępny).
Pola ABAC/RBAC w dokumencie ('lokator _ id',' widoczność ',' acl').
Token wniosku jest podpisany; z multi-najemcą - automatic 'tenant _ id' filter.
8) Paginacja, kursory i spójność
Pagination by seek- cursor by '(score, tie-breaker)' lub '(created_at, id)' po sortowaniu według czasu.
Nieprzezroczyste 'page _ token' z HMAC i TTL.
Spójność: wskaźnik w czasie zbliżonym do rzeczywistego (NRT): opóźnienie 0. 5-2 s pomiędzy zapisem a widocznością. Udokumentuj to w SLA.
Cross-shard: local search → k-way fusion by global order, per-shard cursors in token.
9) AutoComplete i prompts
Sugestie: przedrostek-trie/krawędź-ngrams ма бол, „tytuł”.
Popularne zapytania: dziennik kliknięć → wskazówki dotyczące popularności + personalizacji (segmenty).
Zaklęcie-as-you-type: szybkie wyszukiwanie z ograniczeniem odległości '<= 1'.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) Najważniejsze i snippets
Indeks pozycyjny → pobieranie zwrotów z zapałkami.
Ucieczka HTML, granica długości, związek sąsiednich fragmentów.
Ranking snajperów według gęstości odpowiednich terminów.
11) Wydajność, pamięć podręczna i SLO
Indeksy: gorące segmenty w pamięci; delegowania kompresyjne; wartości doktorskie dla faset.
Pamięć podręczna: L1 (proces), L2 (Redis), pamięć podręczna faset/agregatów; wyłączony przez wersję indeksową.
SLO: P95 <150-200 ms przy 'k <= 20', P99 <500 ms; dostępność 99. 9%.
Ciśnienie wsteczne: zmniejszyć 'k', wyłączyć neuro-etap po przeciążeniu.
Ograniczenie kursu do klucza API/użytkownika/najemcy.
12) Obserwowalność i wskaźniki jakości
Metryki techniczne:- „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 na oznaczonych próbkach.
- CTR @ k, sCTR (satysfakcjonujące kliknięcia), czas zamieszkania, откаz (wskaźnik pogosticka).
A/B: naprawić mierniki „guardrail” (opóźnienie, błędy) + cel (proxy NDCG).
13) Badanie
Testy jednostek adekwatności: sprawdzanie oczekiwanych dopasowań do wniosków kluczowych.
Własność: odporność na typos/synonimy/języki.
Paginacja: brak duplikatów na granicy strony (szukaj umów).
Bezpieczeństwo: filtry dostępu są zawsze stosowane (nawet na faset-count).
Regresje słownikowe: synonimy wersji i zamazane zasady.
14) Bezpieczeństwo i prywatność
Pola z PII nie są indeksowane jako tekst; przechowywać oddzielnie/szyfrować.
Zminimalizuj przechowywane źródła (przechowywać = fałszywe, tylko pola snippet).
Prywatność zapytania: nie rejestruj surowych żądań z PII; anonimizacja/hashing.
Multi-najemca: ścisła izolacja indeksu lub obowiązkowy 'najemca _ id' filter.
15) Migracja i interoperacyjność
Schemat indeksu wersji (v1 → v2) z podwójnym napisem i stopniowym przełącznikiem.
Kompatybilność analizatora: nie należy jeszcze ponownie indeksować starych łańcuchów.
Obrót słowników synonimu/stopword: 'version', 'activated _ at', rollback.
16) Praktyczne przepisy kulinarne
16. 1 Klasyczne wyszukiwanie leksykalne (BM25)
Pola: 'tytuł ^ 3', 'tagi ^ 2', 'ciało ^ 1'.
Analizatory: specyficzne dla języka + lemmatyzacja.
Fuzzy dla krótkich zapytań ('<= 3' żetony), 'fuzziness = 1'.
16. 2 Hybrydowe sparse + gęste
1. ANN search by query embedding (k = 200)
2. Połączenie z top-200 BM25
3. Stopień kalibracji syntezy jądrowej
4. Weź top-N (N = 20), opcjonalnie - rank cross-encoder z dostatecznym budżetem.
16. 3 Nawigacja katalogowa
Twardy filtr wstępny według praw/najemcy
Fasety po filtrze (liczby, w tym aktywne filtry)
Sortowanie według znaczenia lub dziedziny działalności (cena/nowość)
17) Wnioski o próbę (pseudo-DSL)
Filtry i sortowanie: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}
}
Autokompletny:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) Wzory UX
Aktywne chipy filtracyjne + „zresetuj wszystko”.
Puste wyniki: pokaż „spróbuj”... (synonimy, usunąć filtr).
Zero Hints: popularne zapytania/kategorie.
Paginacja kursora (Więcej przycisku) i nieskończone przewijanie; stały wskaźnik zastosowanych filtrów.
Oddzielne przełączniki „uwzględniają typos”, „dokładne dopasowanie frazy”.
19) Częste błędy i anty-wzory
Brak tie-breaker podczas sortowania → podwójne/skoki.
Fasety bez uwzględnienia aktywnych filtrów → „fałszywe” liczby.
Zastosuj filtry dostępu po rankingu.
Mieszanie różnych języków z jednym analizatorem.
Głęboka paginacja OFFSET/LIMIT zamiast szukać kursora.
Nieograniczony rozmyty → eksplozja przez opóźnienie.
20) Lista kontrolna wdrażania
1. Zdefiniuj pola i ich typy, przypisz analizatory per-locale.
2. Zaprojektuj indeks odwrotny + (opts.) wektor ANN.
3. Wdrożyć parser zapytania i bezpieczne filtry wstępne.
4. Skonfigurować BM25 i bodźce terenowe; przyczepić fasony.
5. Wprowadź kursory (nieprzezroczyste, HMAC, TTL) i k-way połączyć przez odłamki.
6. Dodaj autokompletne, najważniejsze, bezpieczne ekranowanie.
7. Wskaźniki: opóźnienie, NDCG @ k, CTR; L1/L2 pamięci podręcznej.
8. Ramy A/B dotyczące adekwatności strojenia.
9. Dokument SLA: Opóźnienie NRT, limity „limitów”, gwarancja spójności.
10. Plan migracji: wersje indeksu, słowników i analizatorów.
Dobrze zaprojektowana warstwa filtrowania i wyszukiwania pełnego tekstu jest nie tylko szybkim indeksem, ale także wyraźną umową protokołu z kursorami, bezpieczeństwem, przewidywalnym UX i wymiernym znaczeniem. To podejście skala od tysięcy do miliardów dokumentów i obsługuje zarówno klasyczne wyszukiwanie leksykalne i nowoczesne scenariusze hybrydowe z rankingu sieci neuronowych.