ES搜索的流程
- 搜索被执行成一个两阶段过程,称之为 Query Then Fetch
- 在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)
- 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列
- 在搜索的时候是会查询Filesystem Cache 的,但是有部分数据还在 Memory Buffer,搜索是近实时的
- 每个分片返回各自优先队列中 所有文档的 ID 和排序值给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表
- 接下来就是取回阶段, 协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并丰富文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端
- Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确, DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,但是性能会变差
Query Phase:协调节点发送查询请求,每个数据节点返回搜索到的文档id以及得分等信息给协调节点
Fetch Phase:协调节点整理返回的文档id后,再向对应的数据节点拉取文档细节,数据节点通过id查询文档细节并丰富后返回
Last Updated: 2022/03/20, 10:04:55