场景
一个index的数据被分配到了多个shard上,每个shard都包含一部分这个index的数据
如图所示,一个搜索请求条件是title中包含java,假如shard1 上面有10条符合条件的document,这个请求到达shard1上的时候,默认是在这个shard本地local去进行IDF计算
在shard2中假如只有1个符合条件的数据,那shard2也会在local计算他的IDF,这时候这个分数就会算的很高
问题
有时候导致出现的搜索结果,似乎不是你想要的结果,也许相关度高的document被排在了后面,很低的被排在了前面但是他的分数很高
解决方案
生产环境
生产环境中,数据量很大的话,在概率学的背景下,一般情况中es都是在多个shard中均匀的路由数据的,比如说有10个document,title都包含java,一共有5个shard,那么在概率学的背景下,如果负载均衡的话,其实每个shard都应该有2个document的title包含java
如果说数据分布均匀的话,就没有上面说的问题了
测试环境
测试环境下,可以将所有的primary shard个数设置为1,只有一个shard的话,所有的document都在这一个shard上面,就没有这个问题了
也可以在搜索时附带search_type=dfs_query_then_fetch参数
计算一个doc的相关度分数的时候,就会将所有shard对的local IDF计算一下,获取出来,在本地进行global IDF分数的计算,会将所有shard的doc作为上下文来进行计算,也能确保准确性.但是production生产环境下,不推荐这个参数,因为性能很差