【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作为上下文来进行计算
      生产上不推荐这个参数,性能很差

  

  

posted @   听风是雨  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
/* 看板娘 */
点击右上角即可分享
微信分享提示