⚡ Elasticsearch 查询流程图

📦 客户端 / Client
SDK / REST API / Kibana
HTTP 请求
🔀 协调节点(Coordinating Node)
接收请求 · 解析 Query DSL · 路由分发
任意节点均可充当协调节点;请求轮询分发
广播到相关分片
Phase 1 · Query Phase
🗂 Primary Shard 0
本地倒排索引
BM25 打分
🗂 Primary Shard 1
本地倒排索引
BM25 打分
🗂 Replica Shard …
读请求可路由
到副本分片
返回 doc_id + _score Top-K
🔢 协调节点:全局归并排序
收集各分片 Top-K · 全局排序 · 取最终 Top-N doc_id
Phase 2 · Fetch Phase
📄 Fetch Phase:按 doc_id 拉取文档
Multi-GET 到对应分片,返回 _source / fields
只拉取最终结果文档,减少 IO
汇总 Hits
🗄 缓存层
Request Cache(聚合)· Field Data Cache · Node Query Cache
命中缓存时跳过分片检索
✅ 响应结果 Response
took · hits.total · hits.hits[ _source, _score, … ]
📦 客户端 接收响应
解析 JSON · 渲染 / 处理业务逻辑
⚠️ 异常 / 特殊路径
场景 处理方式
分片不可用 路由到副本分片;若无副本则返回 500 / partial results
超时 timeout 参数控制,返回已收到的部分结果 + timed_out=true
深翻页 from+size 有 max_result_window 限制;推荐用 search_after 或 scroll
聚合 在 Query Phase 各分片独立聚合,协调节点合并 aggregation 结果