我们以查询匹配度最高的Top10为例,讲解下他们的区别。
1)QUERY_AND_FETCH
1:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,
2:每个分片会把查询的数据(包含数据的分值,以及数据的详细内容)返回给某一个节点进行汇总,排序,然后把这些数据返回给客户端。
这样客户端可能会收到(10*分片数量)的数据
这种方案,数据量和排名都有问题。
优点:效率高,查询速度快
2)QUERY_THEN_FETCH(默认)
1:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,
2:每个分片会把查询的数据(包含数据的分值,以及数据ID)返回给某一个节点进行汇总,排序,取前10名
3:根据前10名的id到对应的分片查询数据的详细内容,返回给客户端
这种方案,解决了数据量的问题,但是排名可能还有问题。
3)DFS_QUERY_AND_FETCH(DFS:初始化散发过程)
1:在查询之前,会把所有分片的词频和文档频率(打分依据)汇总到一块
2:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行
3:每个分片会把查询的数据(包含数据的分值,以及数据的详细内容)返回给某一个节点进行汇总,排序,然后把这些数据返回给客户端
解决了排名的问题,还存在数据量的问题
4)DFS_QUERY_THEN_FETCH
1:在查询之前,会把所有分片的词频和文档频率(打分依据)汇总到一块
2:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,
3:每个分片会把查询的数据(包含数据的分值,以及数据ID)返回给某一个节点进行汇总,排序,取前10名
4:根据前10名的id到对应的分片查询数据的详细内容,返回给客户端。
既解决了排名问题,也解决了数据量的问题,但是性能最低。
总结一下,从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。从搜索的准确度来说,DFS要比非DFS的准确度更高。