详细描述一下 Elasticsearch 搜索的过程?

一、搜索被执行成一个两阶段过程,咱们称之为 Query Then Fetch;ide

二、在初始查询阶段时,查询会广播到索引中每个分片拷贝(主分片或者副本分性能

片)。 每一个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的排序

优先队列。索引

PS:在搜索的时候是会查询 Filesystem Cache 的,可是有部分数据还在 Memory队列

Buffer,因此搜索是近实时的。文档

三、每一个分片返回各自优先队列中 全部文档的 ID 和排序值 给协调节点,它合并it

这些值到本身的优先队列中来产生一个全局排序后的结果列表。class

四、接下来就是 取回阶段,协调节点辨别出哪些文档须要被取回并向相关的分片搜索

提交多个 GET 请求。每一个分片加载并 丰富 文档,若是有须要的话,接着返回请求

文档给协调节点。一旦全部的文档都被取回了,协调节点返回结果给客户端。

五、补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分

片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增

加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,

可是性能会变差。*

Java Program!