Filtreleme ve Tam Metin Arama
1) Neden bir arama katmanına ihtiyacınız var
Filtreleme ve tam metin arama (FTS), verilere yalnızca birincil anahtarlarla değil, "anlamlarına göre" hızlı erişim sağlar. Düzgün tasarlanmış bir arama katmanı şunları birleştirir:- Sıkı filtreler (kategoriler, tarihler, fiyatlar, erişim hakları)
- Tam metin (sözcüksel eşleşme ve sıralama)
- Fasetler (gezinme için kümeler)
- Karma Sıralama (BM25/TF-IDF + Vektör Gömme)
- Güvenilir protokoller (imleç sayfalama, belirteç TTL, çapraz sharding)
2) Mimari resim
Bileşenler:1. Ingest/ETL - normalleştirme, veri tekilleştirme, zenginleştirme, endeks için bina alanları.
2. İndeksleyici: Ters indeks (belirteçler: Belgeler), sütun yapıları, vektör indeksi (HNSW/IVF-PQ).
3. Sorgu Katmanı - istek ayrıştırıcısı, filtrelerin/erişim haklarının uygulanması, parça zamanlayıcı, k-yolu birleştirme.
4. Ranker - BM25 + LTR/Sinirsel yeniden sıralama.
5. Servis - önbellek, imleçler, fasetler, vurgular, otomatik tamamlama.
6. Gözlemlenebilirlik - gecikme, kalite ölçümleri, A/B deneyleri.
3) Veri ve dizin modeli
3. 1 Alanlar ve analizörler
Türler: anahtar kelime (hatta eşleşme), metin (analiz edilmiş), sayısal/tarih/coğrafi, vektör.
Analizörler: tokenization, normalization (küçük harf, Unicode NFKC), filtreler (stopwords, stemming/lemmatization).
Çok dillilik: alan başına analizörler (ru, uk, en); YBÜ analizi; transliterasyon; Aksanların dikkate alınması.
3. 2 Ters indeks (seyrek)
Yapı: terim - gönderme listesi (docID, terim freq, pozisyonlar).
Sıralama: Alan güçlendirmeleri ile BM25 (veya klasik TF-IDF).
3. 3 Vektör indeksi (yoğun)
Metin gömme (örneğin, 384-1024 boyutlu).
ANN yapıları: HNSW, IVF-PQ, Düz (küçük setler için).
Kosinüs yakınlığı/iç ürün; BM25 kalibrasyonu (hibrit).
3. 4 Fasetler ve agregalar
Hızlı sayımlar için değerlerin ön hesaplama/sütun depolama.
Hiyerarşik yönler (kategori/alt kategori).
Aralıklar (fiyat kutuları, tarihler).
4) Sorgular: filtreler + tam metin + sıralama
4. 1 API Sözleşmeleri (REST)
İstek:
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)
Yanıt (fragman):
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 (basitleştirilmiş)
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) Doğal Dil İşleme (NLP)
Tokenization/normalization: Unicode güvenli, tire/kesme işareti muhasebesi.
Stopwords: dillere göre özelleştirme listeleri.
Stemming vs lemmatization: ru/uk lemmatization için daha iyi (kalite> hız).
Eş anlamlı kelimeler: çift yönlü/yönlü sözlükler; TTL ile sözlük versiyonları.
Yazım hataları (bulanık): Mesafe kısıtlaması ve tam eşleşme güçlendirmeleri ile Damerau-Levenshtein.
N-gram/kenar-ngram: otomatik tamamlama ve ipuçları için.
Transliterasyon: "shch" ↔'u "," kyiv/kyiv "- yazışma kuralları.
6) Uygunluk ve sıralama
6. 1 Temel sözcüksel puanlama
Toplama göre 'k1','b 'ayarı ile BM25.
Alanlara göre artırır (başlık ^ 3, etiketler ^ 1. 5, gövde ^ 1).
Tazelik: 'score + = freshness_boost (decay (created_at))'.
6. 2 Davranışsal ipuçları
Tıklama oranı, bekleme süresi, favorilere kaydetme (anti-konumsal bayas ile).
Veri tekilleştirme - ~ aynı içeriğe sahip belgeleri bir araya getirin (MinHash/SimHash).
6. 3 Öğrenme Sıralaması (LTR)
Özellikler: alan BM25, uzunluk, tazelik, popülerlik, cümleye göre eşleşme, konumsal hız.
Modeller: LambdaMART/XGBoost; Çevrimdışı metrikler NDCG @ k, MAP, Precision @ k; Online A/B
6. 4 Nöro-yeniden düzenleme
İki adımlı: geri çağırma (BM25/ANN) - üst-N (örneğin, 200) - çapraz kodlayıcı rerank.
Maliyet muhasebesi: zaman bütçesi, yük altında nöro-aşama olmadan geri dönüş.
6. 5 Hibrit arama (seyrek + yoğun)
Füzyon (hızların ve toplamın normalleştirilmesi) veya çok aşamalı (rerank olarak yoğun).
Kalibrasyon önemlidir: min-max/z-score/kantitatif haritalama.
7) Filtreleme, fasetler ve erişim
7. 1 Filtreler
Operatörler: '=', 'IN', aralıklar, önekler, coğrafi sınırlayıcı kutu/coğrafi mesafe.
Kombinasyonlar: 'VE' filtrelerle, 'VEYA' değerler kümesi içinde (marka IN...).
Yazım güvenliği: sayısal alanlar metin olarak ayrıştırılmaz.
7. 2 Fasetler
Önceden hesaplanmış yapılar için ucuz sayımlar.
"Uygulanan" fasetler kalan filtre sonrası fasetleri gösterir.
7. 3 Erişim/çoklu kiracılık
Güvenlik filtreleri sıralamadan önce entegre edilir (ön filtre).
Belgedeki ABAC/RBAC alanları ('tenant _ id', 'visibility', 'acl').
İstek belirteci imzalandı; Çok kiracılı - otomatik 'tenant _ id' dosyasıyla.
8) Pagination, imleçler ve tutarlılık
Zamana göre sıralandığında seek-cursor tarafından '(score, tie-breaker)'ya da' (created_at, id)'ile pagination.
HMAC ve TTL ile opak 'page _ token'.
Tutarlılık: Gerçek zamana yakın (NRT) indeks: gecikme 0. Kayıt ve görünürlük arasında 5-2 s. SLA'da belgeleyin.
Cross-shard: local search ^ k-way merge by global order, per-shard cursors in belirteç.
9) Otomatik Tamamlama ve istemler
Suggesters: prefix-trie/edge-ngrams по полю 'unvan'.
Popüler sorgular: tıklama günlüğü - popülerlik + kişiselleştirme (segmentler) hakkında ipuçları.
Spell-as-you-type: Mesafe sınırı '<= 1' olan hızlı bulanık arama.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) Vurgular ve snippet'ler
Konumsal dizin - eşleşmelerle ifadeleri alma.
HTML kaçışı, uzunluk sınırı, komşu parçaların birleşimi.
Snippet'leri ilgili terimlerin yoğunluğuna göre sıralamak.
11) Performans, önbellek ve SLO
Dizinler: bellekteki sıcak bölümler; Sıkıştırma ilanları; Fasetler için doc değerleri.
Önbellek: L1 (süreç), L2 (Redis), fasetler/önbellek toplar; dizin sürümüne göre devre dışı.
SLO: P95 <150-200 ms at'k <= 20 ', P99 <500 ms; Kullanılabilirlik 99. 9%.
Geri basınç:'k'yi azaltın, aşırı yüklendiğinde nöro-aşamayı devre dışı bırakın.
API/kullanıcı/kiracı anahtarına hız sınırlaması.
12) Gözlemlenebilirlik ve kalite metrikleri
Teknik metrikler:- '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 işaretli numuneler üzerinde.
- CTR @ k, sCTR (memnun tıklamalar), bekleme süresi, отказ (pogostick oranı).
A/B: "Korkuluk" metriklerini düzeltin (gecikme, hatalar) + hedef (NDCG proxy).
13) Test etme
Uygunluk birimi testleri: Önemli istekler için beklenen eşleşmeleri kontrol etme.
Özellik tabanlı: yazım hataları/eşanlamlılar/dillere karşı direnç.
Sayfalama: sayfa sınırında kopya yok (sözleşmeleri arayın).
Güvenlik: Erişim filtreleri her zaman uygulanır (faset sayısında bile).
Sözlük regresyonları: eş anlamlı sözcükler ve bulanık kurallar.
14) Güvenlik ve gizlilik
PII içeren alanlar metin olarak dizine eklenmez; Ayrı depolayın/şifreleyin.
Depolanan kaynakları en aza indirin (yalnızca store = false, snippet alanları).
Sorgu gizliliği: ham istekleri PII ile kaydetmeyin; anonimleştirme/karma.
Çok kiracılı: sıkı indeks izolasyonu veya zorunlu 'tenant _ id' dosyası.
15) Geçişler ve birlikte çalışabilirlik
Çift yazma ve kademeli anahtarlama ile sürüm indeksi şeması (v1 - v2).
Analizör uyumluluğu: Eski zincirleri henüz yeniden indekslemeyin.
Eşanlamlı/durağan sözlüklerin döndürülmesi: 'sürüm', 'activated _ at', geri alma.
16) Pratik tarifler
16. 1 Klasik Sözcüksel Arama (BM25)
Alanlar: 'başlık ^ 3', 'etiketler ^ 2', 'gövde ^ 1'.
Analizörler: dile özgü + lemmatizasyon.
Kısa sorgular için bulanık ('<= 3' belirteçleri), 'bulanıklık = 1'.
16. 2 Hibrit seyrek + yoğun
1. Sorgu gömme ile ANN arama (k = 200)
2. Top-200 ile birleşin BM25
3. Kalibrasyon Sıra Füzyonu
4. İsteğe bağlı olarak üst-N (N = 20) alın - yeterli bir bütçeyle çapraz kodlayıcıyı sıralayın.
16. 3 Yönlü katalog navigasyonu
Haklara/kiracıya göre sabit ön filtre
Filtre sonrası fasetler (aktif filtreler dahil olmak üzere sayımlar)
Alaka düzeyine veya iş alanına göre sıralama (fiyat/yenilik)
17) Örnek istekleri (pseudo-DSL)
Filtreler ve sıralama: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}
}
Otomatik tamamlama:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) UX desenleri
Aktif filtre yongaları + "tümünü sıfırla".
Boş sonuçlar: "dene" göster... (eşanlamlılar, filtreyi kaldır).
Sıfır İpucu: popüler sorgular/kategoriler.
İmleç sayfalama (Daha fazla düğme) ve sonsuz kaydırma; Uygulanan filtrelerin sabit göstergesi.
Ayrı anahtarlar "yazım hatalarını dikkate alır", "ifadenin tam eşleşmesi".
19) Sık hatalar ve anti-desenler
Sıralama yaparken tie-breaker yok - çiftler/atlar.
Etkin filtreler dikkate alınmadan fasetler - "yanlış" sayılır.
Sıralama sonrası erişim filtreleri uygulayın.
Farklı dilleri tek bir analizörle karıştırmak.
İmleç aramak yerine derin sayfalama OFSET/LIMIT.
Sınırsız bulanık - gecikme ile patlama.
20) Uygulama kontrol listesi
1. Alanları ve türlerini tanımlayın, yerel analizörler atayın.
2. Ters indeksi + tasarlayın (opts.) ANN vektörü.
3. Bir sorgu ayrıştırıcısı ve güvenli ön filtreler uygulayın.
4. BM25 ve alan güçlendirmeleri kurun; faset takın.
5. İmleçleri (opak, HMAC, TTL) girin ve k-yolu parçalarla birleştirin.
6. Otomatik tamamlama, vurgular, güvenli koruma ekleyin.
7. Metrikler: gecikme, NDCG @ k, TO; L1/L2 önbellek.
8. Alaka düzeyini ayarlamak için A/B çerçevesi.
9. Belge SLA: NRT gecikmesi, 'limit' limitleri, tutarlılık garantisi.
10. Geçiş planı: dizin, sözlükler ve analizörlerin sürümleri.
İyi tasarlanmış bir filtreleme ve tam metin arama katmanı sadece hızlı bir dizin değil, aynı zamanda imleçler, güvenlik, öngörülebilir UX ve ölçülebilir alaka düzeyi ile açık bir protokol sözleşmesidir. Bu yaklaşım binlerce belgeden milyarlarca belgeye kadar ölçeklenir ve hem klasik sözlüksel aramayı hem de sinir ağı sıralamasıyla modern melez senaryoları destekler.