【ElasticSearch】基于boost的细粒度搜索条件权重控制
一.需求背景
最近有工作中遇到了关于搜索匹配度的一个搜索需求,即根据某个搜索关键词搜索出来的结果,优先级按精确匹配->最左短语匹配->短语匹配 将搜索结果展示到客户端
二.需求分析
这个需求本质上是需要根据搜索结果与搜索内容的相关度得分(relevance socre)去搜索出匹配度高的结果优先展示出来,因此可以使用boost去将搜索关键词的权重提高
三.实现
修改前的代码
修改后的代码
注意:
这里由于使用了boost提升权重,因此需要将filter查询替换为must查询
四.扩展点
索引在多shard场景下相关度得分(relevant)不准确的问题
出现该问题的原因:
ElasticSearch底层在通过TF/IDF算法计算相关度得分时,会参考下面几个要素
以查询字段A中的值X为例
1.在某个document的字段A中,值X出现了多少次
2.在所有的document的字段A中,值X出现了几次
3.document中的字段A的长度
由于在插入文档时,如果primary shard 没有指定为1,则会根据_id路由到不同的shard,shard中存储了一部分的document,默认情况下,就在shard local 本地计算IDF
所以就导致不同的shard中,如果包含值X的字段A所属的document数量不同,所计算出来的相关度得分也是不一样的
解决方案
1.正式环境下
如果量很大的情况下,在概率学的背景下,ElasticSearch都时在多个shard中均匀路由数据的,路由的时候,根据_id负载均衡
2.测试环境下
将primary shard数量设置为1
3.3.测试环境下
搜索附带serch_type=dfs_query_then_fetch参数,会将shard local中的 IDF取出来 计算Globle IDF。计算document的相关度得分的时候,会将所有shard的document作为上下文来进行计算
生产上不推荐这个参数,性能很差
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!