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

浙公网安备 33010602011771号