GH GambleHub

技术和基础设施→ 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)-在"运行时场"或预展示中显示。

Fasets的示例:
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.
SLO示例:
  • 游戏搜索: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。有了这些原则,您的搜索将是快速,相关和可预测的-并将抵御产品平台的流量峰值。

Contact

联系我们

如需任何咨询或支持,请随时联系我们。我们随时准备提供帮助!

开始集成

Email — 必填。Telegram 或 WhatsApp — 可选

您的姓名 可选
Email 可选
主题 可选
消息内容 可选
Telegram 可选
@
如果填写 Telegram,我们也会在 Telegram 回复您。
WhatsApp 可选
格式:+国家代码 + 号码(例如:+86XXXXXXXXX)。

点击按钮即表示您同意数据处理。