Elasticsearch 搜索的流程
Elasticsearch 的搜索流程是一个分布式协作过程,主要包含 查询阶段(Query Phase) 和 取回阶段(Fetch Phase),默认采用 QUERY_THEN_FETCH 模式。以下是详细流程:
一、请求分发与路由
1.1 客户端请求发送
客户端向集群中任意节点(成为协调节点)发送搜索请求,请求包含查询条件、目标索引等参数。
1.2 目标分片定位
协调节点解析请求,根据索引路由策略(如哈希文档ID)确定所有需要查询的主分片或副本分片位置。请求被并行转发至目标分片所在的数据节点。
二、查询阶段(Query Phase)
2.1 分片本地搜索
每个目标分片独立执行查询:
使用 倒排索引 匹配符合条件的文档 ID。
计算文档相关性得分(如 BM25 算法)。
根据排序规则(如得分、时间)生成优先级队列(Top-N 结果),仅存储文档 ID 和排序信息(非完整文档)。
2.2 返回中间结果
各分片将优先级队列结果(文档 ID + 排序信息)返回给协调节点。
三、结果聚合与排序
3.1 全局结果合并
协调节点聚合所有分片的中间结果:
按全局排序规则(如相关性得分)对所有文档进行重新排序。
根据分页参数(from/size)筛选最终的候选文档 ID。
四、取回阶段(Fetch Phase)
4.1 获取完整文档数据
协调节点向候选文档 ID 所在的分片发送多文档获取请求(Multi-Get)。
各分片返回完整文档内容(包括 _source 字段)。
4.2 组装最终响应
协调节点整合文档数据,补充高亮、聚合结果等附加信息,返回给客户端。
五、高级搜索模式
DFS_QUERY_THEN_FETCH:
在查询前增加全局词频统计步骤,解决分片间评分不一致问题,但性能较低。
关键流程总结
注:若查询包含聚合(Aggregation),各分片会先计算局部聚合结果,协调节点再汇总生成全局聚合数据。