在Elasticsearch 9.2中,`search_type`参数已经被废弃,取而代之的是两种不同的搜索类型,它们分别是:
1. **DFS Query Then Fetch**:
- 这种搜索类型使用两阶段搜索:首先执行分布式频率搜索(Distributed Frequency Search,DFS)来收集全局信息,然后执行查询阶段(Query Phase)和取回阶段(Fetch Phase)。
- 在DFS阶段,协调节点(Coordinating Node)向所有相关数据节点(Data Nodes)发送查询请求,收集统计信息,以便更准确地计算查询的相关性评分。
- 这种搜索类型适合于需要精确评分的场景,例如,当查询包含`bool`查询的`should`子句时。
2. **Query Then Fetch**(默认):
- 这是Elasticsearch的默认搜索类型,它直接执行查询和取回操作,不进行DFS阶段。
- 在查询阶段,协调节点根据本地信息执行查询,然后取回与查询匹配的文档。
- 这种搜索类型通常更快,但在某些情况下可能不如DFS查询精确。
### 两种搜索类型的区别:
- **查询阶段**:
- DFS Query Then Fetch:执行DFS阶段以收集全局信息,然后执行查询。
- Query Then Fetch:直接执行查询,不收集全局信息。
- **评分准确性**:
- DFS Query Then Fetch:使用全局信息进行评分,评分更准确。
- Query Then Fetch:使用本地信息进行评分,可能不够精确。
- **性能**:
- DFS Query Then Fetch:可能比Query Then Fetch慢,因为它涉及额外的DFS阶段。
- Query Then Fetch:通常更快,因为它避免了DFS阶段。
- **适用场景**:
- DFS Query Then Fetch:适用于需要精确评分的复杂查询。
- Query Then Fetch:适用于对评分精度要求不高的场景。
### 搜索流程分析:
- **协调节点**:
- 接收搜索请求,并根据搜索类型决定搜索流程。
- **数据节点**:
- 在DFS Query Then Fetch中,数据节点参与DFS阶段,收集并返回统计信息。
- 在Query Then Fetch中,数据节点仅参与查询和取回阶段。
- **查询阶段**:
- 根据搜索类型执行查询操作。
- **取回阶段**:
- 根据查询结果,从数据节点取回匹配的文档。
### 示例:
```json
GET /index_name/_search
{
"query": {
"match": {
"content": "search term"
}
},
"search_type": "dfs_query_then_fetch" // 或 "query_then_fetch"
}
```
在这个示例中,我们使用`match`查询来搜索`index_name`索引,并指定了搜索类型。虽然`search_type`参数在Elasticsearch 7.x版本中已经被废弃,但在9.2版本中仍然可以使用。
在实际应用中,选择哪种搜索类型取决于具体需求和查询的复杂性。如果对评分的精确性有较高要求,可以选择DFS Query Then Fetch;如果对性能有较高要求,可以选择Query Then Fetch。