基于版本:5.6.2
增删改查操作只对单个文档进行处理,通常由 _index, _type, 和 _id三元组来确定唯一文档。但搜索需要一种更复杂的模型,因为不知道查询会命中哪些文档。一个搜索请求必须询问指定索引的所有分片中的某个副本来进行匹配。假设一个索引有5个主分片,1个副本分片,共10个分片,一次搜索请求会由5个分片来共同完成,他们有可能是主分片,也可能是副分片。也就是说,一次搜索请求只会命中所有副本中的一个。
找到匹配文档仅仅完成了一半,多分片中的结果必须组合成单个排序列表。集群的任意节点都可以接受搜索请求,接收客户端请求的节点成为协调节点,在协调节点,搜索任务被执行成一个两阶段过程,称之为 query then fetch 。 真正执行搜索任务的节点暂且称为数据节点。
在协调节点,相应地实现位于:
查询阶段(query):o.e.a.search.InitialSearchPhase
取回阶段(fetch):o.e.a.search.FetchSearchPhase
他们都继承自:SearchPhase
search_type | phase | 特性介绍 |
---|---|---|
query and fetch | 过时方法 | master根据query条件从shard(独立lucene实例)完成query和fetch再返回,只通信一次,代价是查询from:0 size: |