ElasticSearch 搜索排序不理想问题

ES索引结构如下

ElasticSearch 搜索排序不理想问题

ES检索“区块链”,发现根据得分排序后,排在前面的多为 “链”的数据  而包含整段词语的结果排序非常靠后。

ElasticSearch 搜索排序不理想问题

分析:es一共有7个分片,词语“区块链”在分片的相关性从分片0到分片7依次降低(即分片0存储词语“区块链”相关性最大,分片7相关性最小),如果搜索词语“区块链”需要7个分片的计算;

es默认检索得分是按照分片层次计算,不是全局计算的。

解决方案:

1、只搜索一个索引,并且该索引仅拥有一个分片(理论上,未测试)

2、search_type限定为dfs_query_then_fetch(性能较差,数据量不多的情况下可用且效果明显)

ElasticSearch 搜索排序不理想问题

search_type类型

1、query then fetch(默认的搜索方式)

如果你搜索时,没有指定搜索方式,就是使用的这种搜索方式。这种搜索方式,大概分两个步骤,第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。

2、DFS query and fetch

这种方式比第一种方式多了一个初始化散发(initial scatter)计算全局词频(term frequencies)步骤,有这一步,据说可以更精确控制搜索打分和排名。先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作。优点很明显,数据量是准确并且排名也准确,但性能是最差的。

3、网上还有:query and fetch、DFS query then fetch,但是我的es6.8 应该是没有这两种检索类型,时间关系没有在官网查看,而通过java调用的底层jest框架,发现还有count 和scan类型,暂不探究了。

 参考:

1、https://blog.****.net/HuoqilinHeiqiji/article/details/103460430

2、https://elasticsearch.cn/question/2275