# Search Type

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html)

译文链接 : [http://www.apache.wiki/pages/editpage.action?pageId=4883100](http://www.apache.wiki/pages/editpage.action?pageId=488308)

贡献者 : [ping](/display/~wangyangting)

在执行分布式搜索时可以执行不同的执行路径。分布式搜索操作需要分散到所有相关的分片，然后收集所有的结果。当使用分散/集合类型执行时，有几种方法可以做到这一点，特别是使用搜索引擎。

执行分布式搜索时的一个问题是从每个分片检索多少结果。例如，如果我们有 10 个分片，则第一个分片可以保存从 0 到 10 的最相关的结果，其他分片结果排在其下。为此，当执行请求时，我们需要从所有分片中获取 0 到 10 的结果，对它们进行排序，然后如果我们想要确保正确的结果，则返回结果。

与搜索引擎相关的另一个问题是每个分片独立存在的事实。当在特定分片上执行查询时，它不考虑来自其他分片的项频率和其他搜索引擎信息。如果我们想要支持准确的排名，我们需要首先收集所有分片中的术语频率，以计算全局术语频率，然后使用这些全局频率对每个分片执行查询。

此外，由于需要对结果进行排序，取回大的文档集，或者甚至滚动它，同时保持正确的排序行为可能是非常昂贵的操作。对于大型结果集滚动，最好按 _doc 进行排序，如果返回文档的顺序不重要。

Elasticsearch非常灵活，允许控制在每个搜索请求的基础上执行的搜索类型。可以通过在查询字符串中设置search_type参数来配置类型。类型是：

### Query Then Fetch

参数值： query_then_fetch。

请求分两个阶段处理。 在第一阶段，查询被转发到所有涉及的分片。 每个分片执行搜索并生成对该分片本地的结果的排序列表。 每个分片只向协调节点返回足够的信息，以允许其合并并将分片级结果重新排序为全局排序的最大长度大小的结果集。

在第二阶段期间，协调节点仅从相关分片请求文档内容（以及高亮显示的片段，如果有的话）。

Note：

如果您未在请求中指定 search_type，那么这是默认设置。

### Dfs, Query Then Fetch

参数值：dfs_query_then_fetch

与 “Query Then Fetch” 相同，除了初始分散阶段，其计算分布项频率用于更准确的计分。