ES 搜索类型有哪些?

es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH。

我们以查询匹配度最高的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的准确度更高。

标签: 分片、fetch、dfs、发送给、query、面试
  • 回复
隐藏