https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-search-type.html#dfs-query-then-fetch
查询类型(参数search_type指定):
(一) query_then_fetch
分为两个阶段:
1) 协调节点将请求发送到与搜索语句相关的索引分片(即搜索语句中索引的所有分片)上,各分片分别进行查询(因为每个分片都是一个独立的lucene索引)得到结果,并进行排序,得出(from+size)大小的结果集,然后将轻量级的信息(足够协调节点重新排序)发送给协调节点。协调节点接收到所有分片(超时不侯)的结果,并进行全局排序,这样得到[from,from+size)的结果集。
2) 协调节点从与最终结果相关的分片中获取文档的内容(包括高亮显示的分片等),并返回给客户端。
(二) dfs_query_then_fetch
过程跟query_then_fetch是一样的,不同之处在于第一阶段在计算score的时候使用的term frequency是local的,即只用自己分片的term frequency,会产生的问题是,可能相同的内容在不同的分片得到的得分不一样,也可能出现明明更相关的文档的得分反而比不那么相关的文档的score小。而dfs_query_then_fetch使用全局的term frequency,这样可以得到更准确的scoring。