技術和基礎設施→ Elasticsearch和全文搜索
Elasticsearch和全文搜索
1) Elasticsearch的角色
Elasticsearch(ES)是基於反向索引和柱結構的分布式搜索和分析系統,用於聚合。它給出:- 全文:相關性(BM 25),形態,fuzzy/typo tolerant。
- 面和聚合:按屬性快速切片。
- 混合搜索:BM25+矢量kNN(語義)。
- 開發速度:Query DSL,ingest管道,豐富的生態系統。
對於iGaming/fintech:搜索遊戲/提供商,促銷和規則,快速響應面板(提供商,波動性,RTP,語言),搜索KYC/AML雜誌,解析日誌和差異。
2)數據模型和mappings
2.1索引和字段類型
`date`, `long/double`, `boolean`, `ip`, `geo_point`.
「text」(分析字段)-用於全文。
「keyword」是精確的值/聚合/排序。
「nested」是具有正確字段相關性的對象數組。
「dense_vector」是向量表示(embeddings)。
2.2多目標策略
將字段存儲在多個視圖中:'name。text「(正在分析),」name。raw` (keyword), `name.ngram"(用於巡回演出)。
json
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ru_morph",
"fields": {
"raw": { "type": "keyword", "ignore_above": 256 },
"ngram": { "type": "text", "analyzer": "edge_ngram_2_20" }
}
},
"provider": { "type": "keyword" },
"tags": { "type": "keyword" },
"rtp": { "type": "float" },
"released_at": { "type": "date" },
"lang": { "type": "keyword" },
"embedding": { "type": "dense_vector", "dims": 384, "index": true, "similarity": "cosine" }
}
},
"settings": {
"analysis": {
"filter": {
"ru_stop": { "type": "stop", "stopwords": "_russian_" },
"ru_stemmer": { "type": "stemmer", "language": "russian" },
"syn_ru": { "type": "synonym", "lenient": true, "synonyms": [
"слот,игровой автомат => слот",
"джекпот,суперприз => джекпот"
] }
},
"analyzer": {
"ru_morph": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "ru_stop", "ru_stemmer", "syn_ru"]
},
"edge_ngram_2_20": {
"type": "custom",
"tokenizer": "edge_ngram",
"filter": ["lowercase"],
"char_filter": [],
"tokenizer": "edge_ngram"
}
},
"tokenizer": {
"edge_ngram": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20 }
}
}
}
}
2.3 Nested for fasets
"功能"視圖屬性:[{name, value]]"設計"nested",否則面將產生錯誤的匹配。
3)相關性: BM25,雜種和雜種
3.1經典(BM25)
將字段與權重組合(標題^4,標題^2,說明)。
使用「minimum_should_match」控制「嘈雜」匹配。
3.2向量(kNN)+BM25 (rerank)
「dense_vector」中的Embeddings(例如384-768)。
首先通過矢量(top 200-500)進行kNN,然後恢復BM25+業務增強(新穎性,RTP,區域許可)。
json
{
"knn": {
"field": "embedding",
"query_vector": [/... /],
"k": 400, "num_candidates": 2000
},
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "египетские слоты джекпот",
"fields": ["title^4","tags^2","description"],
"type": "best_fields",
"minimum_should_match": "60%"
}}
],
"filter": [
{ "term": { "region": "TR" }},
{ "range": { "rtp": { "gte": 94.0 }}}
]
}
},
"rescore": {
"window_size": 400,
"query": {
"rescore_query": {
"function_score": {
"query": { "match_all": {} },
"boost_mode": "sum",
"functions": [
{ "gauss": { "released_at": { "scale": "180d", "offset": "30d", "decay": 0.5 } } },
{ "field_value_factor": { "field": "popularity", "factor": 0.2, "modifier": "log1p" } }
]
}
}
}
},
"highlight": { "fields": { "title": {}, "description": {} } }
}
4)自動補充和提示
方法:- 標題下方的Edge N-gram。ngram"(快速,簡單)。
- Completion suggesters(「completion」字段)-快速提示,但單獨的索引路徑。
- Search-as-you-type-結合標記化來開始單詞和短語。
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}
5)同義詞,錯字和多語言
同義詞:通過「synonym」過濾器下載文件/列表;共享域名(賭場/體育)。
錯字:「fuzziness: AUTO」在「multi_match」中,限制長度和字段。對於提示-「fuzzy」完成模式。
- 索引每個位置(ru/en/tr/pt-BR)或多分析器方案:「title_ru」,「title_en」。
- Разные analyzers: `russian`, `english`, `turkish`, `portuguese`.
- 將語言轉換為路由密鑰(路由),以保持「熱」位置更靠近用戶。
6)過濾器,面板和聚合
對於面板,請使用「keyword」和「nested」聚合。
避免聚合中的基線字段(唯一ID)-在「運行時場」或預展示中顯示。
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}
7)數據輸入和文本清理
Ingest管道:規範化、字段提取、地理編碼、HTML刪除。
Attachment/ingest-ocr(根據需要):PDF/圖像索引(密切關註PII)。
Lemmatization:通過分析儀或外部pipline (precompute令牌)。
8)Shards,復制品和ILM
8.1尺寸和緩存
更少的沙丁魚-最好。目標:每張10-50 GB用於混合負載。
從「number_of_shards:1-3」開始,根據事實進行擴展。復制品-銷售中最少1個。
8.2 ILM (Lifecycle)
hot → warm → cold → delete for log/story promo。
「冷」片段的壓縮(force merge)。
對於目錄和產品搜索-具有周期性優化的「無限期」熱門。
8.3無市區遷移算法
新的"games_v2" → alias 'games"索引在"reindex"和backfill之後切換。已破土動工-逐步清理。
9)Snapshots,DR和更新
快照到對象存儲(S3/GCS),時間表和恢復檢查。
滾動更新註釋,驗證分區獎勵。
DR計劃:用於關鍵索引(參考書、目錄)的跨區域復制(CCR)。
10)安全和PII
客戶端和群集之間的TLS/mTLS。
RBAC:指數/操作角色;Dev/Stage/Prod是分開的。
PII/PCI:不必要地用個人數據索引字段;使用ingest掩碼。
Right to be forgotten:存儲到文檔的鏈接,以便從user_id中刪除;軟刪除+reindex/公告。
11)可觀察性和SLO搜索
度量標準:- 在query上P50/P95/P99 latency,錯誤4xx/5xx。
- Cache hit (query cache / shard request cache).
- Heap usage, GC паузы, segment merges, threadpools (search/write).
- Hot shards/hot nodes, rejections.
- KNN: `graph_hits`, `search_k`, latency, recall@k.
- 遊戲搜索:P95 ≤ 200毫秒,錯誤<0。5%在30分鐘窗口中。
- 線索:P95 ≤ 80毫秒。
- KNN混合動力車:前20名成績P95 ≤ 350毫秒。
12) FinOps: 成本和性能
索引大小:通過令牌化節省,禁用不必要的「fielddata」,僅在需要時使用「doc_values」。
細分:計劃一項政策,不要允許「粉碎」。
根據RAM/CPU,KNN更昂貴:限制BM25上的預過濾器dims,「num_candidates」。
RAM中的熱場:監控現場數據/頭;將「重」聚合帶到單獨的索引中。
13)查詢示例
13.1多重全文增益
json
{
"query": {
"multi_match": {
"query": "book of",
"fields": ["title^4","title.ngram^2","tags^2","description"]
}
},
"sort": ["_score", { "released_at": "desc" }]
}
13.2個過濾器+面板
json
{
"query": {
"bool": {
"must": [{ "match": { "title": "египет" }}],
"filter": [
{ "terms": { "provider": ["Novomatic","PragmaticPlay"]}},
{ "range": { "rtp": { "gte": 95 }}}
]
}
},
"aggs": {
"by_provider": { "terms": { "field": "provider" } },
"by_year": { "date_histogram": { "field": "released_at", "calendar_interval": "year" } }
}
}
13.3 Nested屬性過濾
json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features.name": "volatility" }},
{ "term": { "features.value": "high" }}
]
}}
}
}
}
13.4按邏輯搜索(ECS) with highlight
json
{
"query": {
"bool": {
"must": [{ "match_phrase": { "message": "payment declined" }}],
"filter": [
{ "term": { "service.name": "payments" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
},
"highlight": { "fields": { "message": { "number_of_fragments": 0 } } }
}
14) Multi-tenant和隔離
在tenant上索引(更好)或「tenant_id」+ACL過濾器(在聚合上更昂貴)。
通過「tenant_id」進行路由以定位縫隙。
將tenant請求限制為限制/定時,「查詢」。phase` guard-rails.
15)實施支票
1.圖:「text/keyword/nested」+多域,「dense_vector」(如果需要)。
2.按語言分析儀,同義詞,edge-ngram用於自動輔助。
3.相關性:BM25助推器+混合動力kNN→rescore。
4.立面:keyword/nested,僅在「健康」字段中匯總。
5.索引:ingest pipelines(歸一化),butch下載。
6.搖搖欲墜:從小外星人開始移動,ILM開始「長」巢穴。
7.DR:關鍵索引的快照時間表,恢復檢查,CCR。
8.安全性:TLS、RBAC、PII掩蔽、刪除策略。
9.可觀察性:latency, heap/GC, cache hit, hot shards, rejections。
10.FinOps:索引大小,kNN參數化,禁用多余的「doc_values/fielddata」。
16)反模式
單個「每個」索引:不同的域(目錄、日誌、事務)需要不同的設置。
無意識的「fuzzinesse: AUTO」在所有領域→緩慢而嘈雜。
同義詞「吞噬意義」:不要共享字典域。
在需要田間捆綁→假筋膜的地方沒有固定。
過多的硬件(每個文檔一個)是集群狀態的開銷。
遷移時不使用alias是停機時間和「bit」鏈接。
PII的「原樣」索引是監管風險和昂貴的reindex。
17) iGaming/fintech上下文: 快速食譜
遊戲搜索:「multi_match」帶有「title^4」的助推器,「tags^2」,提供商/波動性的面板,區域/貨幣過濾器,帶有「主題」矢量的混合體(例如「埃及」,「水果經典」)。
促銷/獎金:同義詞(「frispins」,「free spins」),「active_from/active_to」數據過濾器,通過完成的提示。
KYC/AML期刊:ECS圖形,「消息」全文,「rule_name」,「country」聚合,「@timestamp」直方圖異常。
提供商手冊:門面和排序的密鑰字段;文本描述是具有形態的「文本」。
調節頁:多語言字段,「search_as_you_type」用於軟提示。
結果
在Elasticsearch上進行有效的搜索不僅是「啟用BM 25」:它們是正確的分析儀和模擬器,多域和固定,VM25+矢量混合體,整齊的面和聚集,硬化和ILM學科,清晰的SLO和可觀察性以及安全性和FinOps。有了這些原則,您的搜索將是快速,相關和可預測的-並將抵禦產品平臺的流量峰值。