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

我们都知道es是一个分布式的存储和检索系统,在存储的时候默认是根据每条记录的_id字段做路由分发的,这意味着es服务端是准确知道每个document分布在那个shard上的。
相对比于CURD上操作,search一个比较复杂的执行模式,因为我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请求必须查询一个索引或多个索引里面的所有shard才能完整的查询到我们想要的结果。
找到所有匹配的结果是查询的第一步,来自多个shard上的数据集在分页返回到客户端的之前会被合并到一个排序后的list列表,由于需要经过一步取top N的操作,所以search需要进过两个阶段才能完成,分别是query和fetch。

一.query(查询阶段)

当一个search请求发出的时候,这个query会被广播到索引里面的每一个shard(主shard或副本shard),每个shard会在本地执行查询请求后会生成一个命中文档的优先级队列。
这个队列是一个排序好的top N数据的列表,它的size等于from+size的和,也就是说如果你的from是10,size是10,那么这个队列的size就是20,所以这也是为什么深度分页不能用from+size这种方式,因为from越大,性能就越低。

es里面分布式search的查询流程如下:

客户端发送一个search请求到Node 3上,然后Node 3会创建一个优先级队列它的大小=from+size2,接着Node 3转发这个search请求到索引里面每一个主shard或者副本shard上,每个shard会在本地查询然后添加结果到本地的排序好的优先级队列里面。3,每个shard返回docId和所有参与排序字段的值例如_score到优先级队列里面,然后再返回给coordinating节点也就是Node 3,然后Node 3负责将所有shard里面的数据给合并到一个全局的排序的列表。

上面提到一个术语叫coordinating node,这个节点是当search请求随机负载的发送到一个节点上,然后这个节点就会成为一个coordinating node,它的职责是广播search请求到所有相关的shard上,然后合并他们的响应结果到一个全局的排序列表中然后进行第二个fetch阶段,注意这个结果集仅仅包含docId和所有排序的字段值,search请求可以被主shard或者副本shard处理,这也是为什么我们说增加副本的个数就能增加搜索吞吐量的原因,coordinating节点将会通过round-robin的方式自动负载均衡。

二.fetch(读取阶段)


流程如下:

1,coordinating 节点标识了那些document需要被拉取出来,并发送一个批量的mutil get请求到相关的shard上2,每个shard加载相关document,如果需要他们将会被返回到coordinating 节点上3,一旦所有的document被拉取回来,coordinating节点将会返回结果集到客户端上。

这里需要注意,coordinating节点拉取的时候只拉取需要被拉取的数据,比如from=90,size=10,那么fetch只会读取需要被读取的10条数据,这10条数据可能在一个shard上,也可能在多个shard上所以 coordinating节点会构建一个multi-get请求并发送到每一个shard上,每个shard会根据需要从_source字段里面获取数据,一旦所有的数据返回,coordinating节点会组装数据进入单个response里面然后将其返回给最终的client。

三.总结:

本文介绍了es的分布式search的查询流程分为query和fetch两个阶段,在query阶段会从所有的shard上读取相关document的docId及相关的排序字段值,并最终在coordinating节点上收集所有的结果数进入一个全局的排序列表后,然后获取根据from+size指定page页的数据,获取这些docId后再构建一个multi-get请求发送相关的shard上从_source里面获取需要加载的数据,最终再返回给client端,至此整个search请求流程执行完毕

参考

http://www.shouhuola.com/q-29712.html

详细描述一下Elasticsearch搜索的过程相关推荐

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

    1.搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch: 2.在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片). 每个分片在本地执行搜索并构建一个匹配文档 ...

  2. 1、请简述DNS的作用,并说明当你输入网址“www.nxtc.edu.cn“按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) 2、详细描述域名劫持攻击的过程及防御方式。

    一.请简述DNS的作用,并说明当你输入网址"www.nxtc.edu.cn"按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) DNS的作用: 把网址解析转化成ip地址, ...

  3. 详细描述一下 Elasticsearch 更新和删除文档的过程。

    1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不能被删除或者改动以展示其变更. 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真的 ...

  4. 详细描述一下 Elasticsearch 索引文档的过程。

    1.当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 MemoryBuffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 MomeryBuffer 到 ...

  5. Elasticsearch 搜索的高级功能学习

    在文章 Elasticsearch 入门学习 中介绍了 Elasticsearch 的基础概念以及一些常用的 API.这篇文章是继续对 Elasticsearch 中一些高级的搜索功能的学习和总结: ...

  6. 图解原理!秒懂ElasticSearch搜索如此简单

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我的搜索 ...

  7. 图解ElasticSearch 搜索原理

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.cnblogs.com/ri ...

  8. 图解 ElasticSearch 搜索原理

    摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我的搜索 *foo-bar* 无法匹配 foo-bar ? 为什么增加更多的文件会压缩索引(Ind ...

  9. Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索

    在今天的文章中,我将介绍如何使用 Go 语言来对 Elasticsearch 进行搜索.首先,我假设你已经对 Elastic Stack 有一定的了解.Elasticsearch 获得了极大的欢迎. ...

最新文章

  1. 最近刷爆朋友圈的一道面试题
  2. eclipse中动态web项目快捷方式设置
  3. 提示计算机未安装flash,大师应对安装了flash,但浏览器提示没安装,如何解决...
  4. 近期值得读的10篇GAN进展论文
  5. Java实现单链表的合并(保证数据的有序性)
  6. 抄作业了!6 大 Flask 开源实战项目推荐
  7. 当装了两个tomcat后,如何修改tomcat端口
  8. 微服务实践:全栈小团队“洪荒之力”改造阿里服务CRM技术体系
  9. k8s 使用 Init Container 确保依赖的服务已经启动
  10. MIT发布软体机器鱼,卧底鱼群大计可成
  11. RMAN 学习过程之四,备份演练进阶篇
  12. 我的PCB职业,请大家多指教!
  13. mysql 新增字段时判断字段是否存在
  14. 标准误计算机excel公式,excel标准误差怎么算
  15. 淘宝直播再升级!淘系自研GRTN 新一代多媒体传输网络
  16. HTML/CSS制作网页
  17. 学习新浪微博计数服务
  18. 华为云上云迁移工具案例实践:阿里云迁移到华为云
  19. java FreeMarker模板路径问题
  20. MySQL数据库出现unknown error 1449错误原因及其解决办法

热门文章

  1. 选择工业建模好还是游戏建模更有前途?资深建模师为你解答
  2. Android获取Bitmap网络图片类型
  3. 警惕:低头族颈椎病的福音:瑜伽颈椎疗法
  4. 镇魔曲手游服务器维护,镇魔曲2月9日维护公告 元宵节活动预告
  5. python处理mongodb的ObjectId
  6. untiy 录制网络摄像头视频并保存到本地文件
  7. 【1】少儿Python编程学习_Microbit展示名字
  8. 查看修改MySQL表结构命令
  9. 怎么用计算机打吃鸡,Win10系统笔记本玩绝地求生(吃鸡)卡怎么办
  10. 三分钟教会你怎么翻译英文语音