这个查询的过程被描述在图分布式搜索查询阶段中。
查询阶段包含以下三步:
1.客户端发送一个请求给Node 3
,Node 3
创建了一个长度为的空优先级队列。
2.Node 3
转发这个搜索请求到索引中每个分片的原本或副本。每个分片在本地执行这个查询并且结果将结果到一个大小为from+size
的有序本地优先队列里去。
3.每个分片返回document的ID和它优先队列里的所有document的排序值给协调节点。Node 3
把这些值合并到自己的优先队列里产生全局排序结果。
当一个搜索请求被发送到一个节点Node,这个节点就变成了协调节点。这个节点的工作是向所有相关的分片广播搜索请求并且把它们的响应整合成一个全局的有序结果集。这个结果集会被返回给客户端。
每一个分片在本地执行查询和建立一个长度为的有序优先队列——这个长度意味着它自己的结果数量就足够满足全局的请求要求。分片返回一个轻量级的结果列表给协调节点。只包含documentID值和排序需要用到的值,例如_score
。
协调节点将这些分片级的结果合并到自己的有序优先队列里。这个就代表了最终的全局有序结果集。到这里,查询阶段结束。
整个过程类似于归并排序算法,先分组排序再归并到一起,对于这种分布式场景非常适用。