ElasticSearch 搜索排序不理想问题
ES索引结构如下
ES检索“区块链”,发现根据得分排序后,排在前面的多为 “链”的数据 而包含整段词语的结果排序非常靠后。
分析:es一共有7个分片,词语“区块链”在分片的相关性从分片0到分片7依次降低(即分片0存储词语“区块链”相关性最大,分片7相关性最小),如果搜索词语“区块链”需要7个分片的计算;
es默认检索得分是按照分片层次计算,不是全局计算的。
解决方案:
1、只搜索一个索引,并且该索引仅拥有一个分片(理论上,未测试)
2、search_type限定为dfs_query_then_fetch(性能较差,数据量不多的情况下可用且效果明显)
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