[ElasticSearch2.x]原理之分布式搜索
这个要比基本的创建-读取-更新-删除(CRUD)请求要难一些。CRUD操作是处理的单个文档。这就意味着我们明确的知道集群中的哪个分片存储我们想要的文档。
一个 CRUD 操作只对单个文档进行处理,文档有唯一的组合,由 _index
, _type
, 和 路由值 (默认是该文档的 _id
)组成。 这表示我们确切的知道此文档在集群中哪个分片中。
搜索请求是更复杂的执行模型,因为我们不知道哪些文档会与查询匹配,它们可能存在在集群中的任意一个分片中。一个搜索请求不得不搜索我们关注的一个或多个索引中的每个分片拷贝(主分片或者副本分片),以查看分片中中是否有匹配的文档。
但找到所有匹配到文档只是完成了一半工作.在search
API返回一“页”结果之前,来自多个分片的结果必须聚合成单个排序的列表。 因此,搜索在两阶段过程中执行,query
和fetch
。
1. Query阶段
在初始化查询阶段(query phase),查询将广播到索引中的每个分片的拷贝上(主分片或者副本分片)。每个分片在本地执行搜索并且建立了匹配文档的优先队列(priority queue)。
1.1 优先级队列
优先级队列priority queue
只是一个存有前n个(top-n)匹配文档的有序列表。优先级队列的大小取决于from
和size
分页参数。 例如,以下搜索请求将需要足够大的优先级队列来容纳100个文档:
GET /_search { "from": 90, "size": 10 }
1.2 Query
Query阶段过程如下图所示:
Query阶段包含如下步骤:
(1) 客户端发送一个Search
请求给节点 3,节点 3 创建了一个长度为from+size
的空优先级队列。
(2) 节点3将搜索请求转发到索引中每个分片的一个主分片或副本分片上( forwards the search request to a primary or replica copy of every shard in the index)。 每个分片在本地执行查询,并将结果添加到大小为from
+size
的本地排序的优先级队列中。
(3) 每个分片将其优先级队列中的所有文档的文档ID和排序值返回给协调节点节点3,节点3将这些值合并到其自己的优先级队列中,以生成全局排序的结果列表。
当一个搜索请求被发送到一个节点,这个节点就变成了协调节点。这个节点的工作是向所有相关的分片广播搜索请求并且把它们的响应整合成一个全局的有序结果集。将这个结果集返回给客户端。
第一步是将请求广播到索引里每个节点的一个主分片或者副本分片上(broadcast the request to a shard copy of every node in the index)。就像document的GET请求一样,搜索请求可以被主分片或者任意副本分片处理。所以说更多的副本能够更高效的提高搜索。协调节点将在之后的请求中轮询所有的分片拷贝来分摊负载。
每一个分片在本地执行查询和建立一个长度为from+size
的有序优先级队列——这个长度意味着它自己的结果数量就足够满足全局的请求要求。分片返回一个轻量级的结果列表给协调节点。只包含文档ID值和排序需要用到的值,例如_score。
协调节点将这些分片结果合并到其自己的排序优先级队列中,表示全局排序的结果集。 到此查询阶段结束。
备注
索引可以由一个或多个主分片组成,因此针对单个索引的搜索请求需要能够组合来自多个分片的结果。 搜索多个或所有索引的工作方式完全相同 - 只是会涉及更多的分片。
2. Fetch 阶段
查询阶段标示出哪些文档满足我们的搜索请求,我们只返回了文档ID以及对排序有用的值,并没有返回文档本身。们仍然需要检索那些文档。这就是fetch
阶段的工作,过程如下图所示:
分发阶段由以下步骤构成:
(1) 协调节点标示出哪些文档需要取回,并且向相关分片发出GET请求。
(2) 如果需要,每个分片加载文档,然后将文档返回协调节点。
(3) 一旦所有的文档都被取回,协调节点将结果返回给客户端。
协调节点首先决定哪些文档是实际需要取回的。例如,如果我们查询指定{ "from": 90, "size": 10 }
,那么前90条结果将会被丢弃,只需要检索接下来的10个结果。这些文档可能来自与查询请求相关的一个、多个或者全部分片。
协调节点给拥有相关文档的每个分片创建一个multi-get request
,并发送请求给同样处理查询阶段的分片拷贝。
分片加载文档体-- _source
字段--如果有需要,用metadata
和search snippet highlighting
丰富结果文档。 一旦协调节点接收到所有的结果文档,它就组合这些结果为单个响应返回给客户端。
原文:https://www.elastic.co/guide/en/elasticsearch/guide/current/distributed-search.html
https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_phase.html
https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CentOS7 搭建Ambari-Server,安装Hadoop集群(一)
2017-07-05:修正几处拼写错误,之前没发现,抱歉! 第一次在cnblogs上发表文章,效果肯定不会好,希望各位多包涵。 编写这个文档的背景是月中的时候,部门老大希望我们能够抽时间学习一下Hadoop大数据方面的技术;给我的学习内容是通过Ambari安装Hadoop集群。通过一周左右的学习和实践,整理出现在这篇安装心得。第一篇,重点放在Ambari-Server的搭建安装上。 安装默认使用Root用户,避免权限问题导致不成功。 使用4台虚拟机构建Ambari-Server、Hadoop集群,分配如下: - 一台虚拟机,作为Ambari-Server: Hostname: ambari.server - 三台虚拟机,作为Hadoop集群: Hostname01: hadoop.namenode Hostname02: hadoop.datanode1 Hostname03: hadoop.datanode2 1. 安装前的系统设定 a) 修改机器名、Hosts文件 查看当前的Hostname: # hostname 修改Hostname:(以ambari.server为例) # h...
- 下一篇
HBase thrift2 TIOError
如果HBase thrift2报:“TIOError exception: Default TException”, 这个可能是因为操作的表不存在,不一定是网络或磁盘操作异常。 HBase Thrift2偷懒了,所有异常被统一成了TIOError和TIllegalArgument两个异常, 导致调用者无法区分,而且出错信息也没能很好的带过来,增加了定位工作量。 在HBase client中为如下一个继承关系: public class TableNotFoundException extends DoNotRetryIOException public class DoNotRetryIOException extends HBaseIOException public class HBaseIOException extends IOException HBase master相关日志: 2017-05-27 17:20:42,879 ERROR [thrift2-worker-7] client.AsyncProcess: Failed to get region location...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装