深度解析:Elasticsearch检索请求原理

在上一篇文章中,我们学习了 Elasticsearch 的写入流程,今天我们来学习一下 Elasticsearch 的读取流程,当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢?

下面先说一下一个总的检索流程。

1、客户端发送请求到任意一个节点,该节点就是协调节点。

2、协调节点将查询请求广播到每一个数据节点,这些数据节点的分片就会处理该查询请求。

3、每个分片进行数据查询、将符合条件的数据放在一个队列之中,将这些数据的文档ID节点信息,分片信息返回给协调节点

4、协调节点将所有的结果汇总、排序。

5、协调节点向包含这些文档ID的分片发送 get 请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据整合返回给客户端。

单个文档

对于取回单个文档来说:

1、客户端向 node1 节点发送检索请求。

2、node1 节点通过对传入的文档的 _id 进行计算,确定文档属于分片0,但是分片0的副本分片在三个节点上都存在,在这里,Elasticsearch 将请求转发到了 node2 上(轮询-负载均衡)。

3、node2 节点将文档返回给 node1

4、node1 将文档返回给客户端。

在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。

在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片。 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的。

上面是根据ID检索单个文档,流程相对简单,那么如果是多个文档,流程又回增加哪些步骤呢?

多个文档

简单一句话就是,在单个文档的请求中,Elasticsearch 知道该文档在哪个分片上。在多文档请求中,Elasticsearch 会将该请求拆分为多个文档的请求,并把它们并行的发送到对应的分片。

对于多个文档请求,mget 请求顺序:

1、客户端向 node1 发送 mget 请求。

2、node1 节点为每个分片构建多个文档的 get 请求。

3、并行转发这些请求到每个文档对应的主分片或者副本分片的节点上。

4、node1 根据收到的响应返回给客户端。

可以对文档设置单独的 routing 参数。

对于检索流程,看上去就简单很多了,没有那么多的数据一致性等相关限制的处理。

如果感觉本文写的还不错的话欢迎点个关注,后面继续来写代码中的检索实现。一起走进源码的世界。

如有错误也欢迎指出,一起成长。

参考链接

https://www.elastic.co/guide/cn/elasticsearch/guide/current/distrib-read.html

https://www.elastic.co/guide/cn/elasticsearch/guide/current/distrib-multi-doc.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卓翼飞思全国合作伙伴火热招募,共筑智能生态

摘要:市场有可为,政策高扶持 抢占AI高地,共筑智能生态 卓翼飞思全国合作伙伴招募计划 在人工智能的浪潮下,我们正见证一个由数据驱动、智能主导的新时代的到来。无人智能技术作为人工智能领域的重要分支,正在以其独特…

Qt篇——Qt无法翻译tr()里面的字符串

最近遇到使用Qt语言家翻译功能时,ui界面中的中文都能够翻译成英文,但是tr("测试")这种动态设置给控件的中文,无法翻译(lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译)。 上网搜了很多资料&am…

Linux 常用命令(1)

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:Linux 随笔集合 …

【漏洞复现】通天星CMSV6 admin 弱口令漏洞(CVE-2024-29666)

0x01 产品简介 CMSV6平台是基于车辆位置信息服务和实时视频传输服务的创新技术和开放运营理念。为GPS运营商车辆硬件设备制造商、车队管理企业等车辆运营相关企业提供核心基础数据服务。 0x02 漏洞概述 CMSV6 7.31.0.2、7.32.0.3版本中存在弱密码漏洞,未授权的攻…

【Linux】图文详解Xshell远程连接服务器:以Amazon EC2 VPS为例

文章目录 问题描述解决方案Q&A 问题描述 本地cmd或powershell使用ssh -i “your.pem” user_nameip_address是可以登录Amazon EC2云服务器的。 然而,当使用XShell以SSH加载PEM文件方式登录亚马逊EC2云服务器,一直出现输入密码的问题,如…

小狐狸JSON-RPC:wallet_addEthereumChain(添加指定链)

wallet_addethereumchain(添加网络) var res await window.ethereum.request({"method": "wallet_addEthereumChain","params": [{"chainId": "0x64", // 链 ID (必填)"…

JavaEE 初阶篇-深入了解多线程等待与多线程状态

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 线程等待 1.1 线程等待 - join() 方法 1.1.1 main 线程中等待多个线程 1.1.2 main 线程等待 t2 线程且t2 线程等待 t1 线程 1.1.3 其他线程阻塞等待 main 线程 1.…

Webpack常见插件和模式

目录 目录 目录认识 PluginCleanWebpackPluginHtmlWebpackPlugin自定义模版 DefinePlugin的介绍 ( 持续更新 )Mode 配置 认识 Plugin Loader是用于特定的模块类型进行转换; Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等 …

基于ThinkPHP+Uniapp开发的房产管理系统

一款基于ThinkPHPUniapp开发的房产管理系统,支持小程序、H5、APP;包含房客、房东、经纪人三种身份。核心功能有:新盘销售、房屋租赁、地图找房、房源代理、在线签约、电子合同、客户CRM跟进、经纪人收益、分享佣金等 多终端 Uniapp开发&…

系统开发实训小组作业week5 —— 用例描述与分析

目录 4.3 UC003电影浏览与查询 4.3.1 用例描述 4.3.2 活动图 4.3.3 界面元素 4.3.4 功能 4.4 UC004在线订票 4.4.1 用例描述 4.4.2 活动图 4.4.3 界面元素 4.4.4 功能 4.3 UC003电影浏览与查询 4.3.1 用例描述 用例号 UC003-01 用例名称 电影浏览与查询 用例描述…

Spring Boot 统一数据返回格式 分析 和 处理

目录 实现统一数据格式 测试 原因分析 解决方案 🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 实现统一数据格式 统⼀的数据返回格式使⽤ ControllerAdvice 和 Response…

基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析+爬虫+机器学习)

这里写目录标题 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习)一、项目概述二、微博热词统计析三、微博文章分析四、微博评论分析五、微博舆情分析六、项目展示七、结语 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习) 一、项目概…

【C++】vector模拟实现

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. vector源码3. 构造、赋值和析构3.1 无参构造3.2 拷贝构造3.3 迭代器区间构造3.4 赋值3.5 析构 4. Capacity4.1 size4.2 capacity4.3 empty4.4 resize4.5 reserve 5. 下标访问和迭代器6. 输出7. Modifiers7.…

C# 操作 Word 全域查找且替换(含图片对象)

目录 关于全域查找且替换 Word应用样本 SqlServer数据表部分设计样本 范例运行环境 配置Office DCOM 设计实现 组件库引入 实现原理 查找且替换的核心代码 窗格内容 页眉内容 页脚内容 形状内容 小结 关于全域查找且替换 C#全域操作 Word 查找且替换主要包括如下…

平台不是问题,音乐集中播放:Listen 1

Listen 1:跨越平台,畅享音乐。让万千歌曲一键集中播放,让好音乐无界聆听。- 精选真开源,释放新价值。 概览 不论你日常倾向于哪一款在线音乐服务,无论是网X云音乐,QX音乐抑或是虾X音乐,恐怕最令…

【Java】ArrayList数组的扩容机制 jdk1.8

📝个人主页:哈__ 期待您的关注 ArrayList和普通数组不同,ArrayList支持动态扩容,那么ArrayList到底是如何扩容的呢?你又是否知道ArrayList数组的初始长度是多少呢? 在开始介绍之前,我们要先介…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言,实现一个导航与内容二级联动的效果。 2 标题 二级联动(ArkTS) 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能: 切换左侧导航&#xff…

鸿蒙OS开发实战:【打造自己的搜索入口】

背景 几乎每家应用中都带有搜索功能,关于这个功能的页面不是特别复杂,但如果要追究其背后的一系列逻辑,可能是整个应用中最复杂的一个功能。今天主要实践目标,会抛开复杂的逻辑,尝试纯粹实现一个“搜索主页”&#xf…

初识Node.js与内置模块

能够知道什么是 Node.js能够知道 Node.js 可以做什么能够说出 Node.js 中的 JavaScript 的组成部分能够使用 fs 模块读写操作文件能够使用 path 模块处理路径能够使用 http 模块写一个基本的 web 服务器 一.初识Node.js 1.浏览器中的 JavaScript 的组成部分 2.Node.js 简介 …

MySQL创建表:练习题

练习题: 创建一个名为"students"的数据库,并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表,包含以下字段: id: 整数类型 name: 字符串类型,学生姓名 subject: 字符串…