首页 > 其他分享 >浅析 es 查询文档的过程

浅析 es 查询文档的过程

时间:2023-10-27 11:34:02浏览次数:33  
标签:search final 浅析 响应 文档 分片 节点 es

本文从一个示例入手,从代码层面分析 elastic search 查询文档的完整过程。

新建索引 cn-msg,设置 3 分片,1 副本

PUT localhost:9200/cn-msg
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

写入文档

POST localhost:9200/cn-msg/_doc
{
    "messageId": "6a5955ee28ec4ce483ebb8a4d6a4d214",
    "status": 1
}

查询文档

POST localhost:9200/cn-msg/_search
{
  "query": {
    "match": {
      "messageId": "6a5955ee28ec4ce483ebb8a4d6a4d214"
    }
  }
}

接收到查询文档请求的节点称为协调节点,协调节点收到请求,将查询请求转发给 3 个分片所在的节点,等待这 3 个分片的响应,汇总响应发送给客户端(暂且可以这么认为,这里还有一步 query then fetch)。

转发查询请求:

// org.elasticsearch.action.search.AbstractSearchAsyncAction#run

for 循环遍历 3 个分区,向 3 个分区发送查询请求:

浅析 es 查询文档的过程_elasticsearch

协调节点收到分区的响应后,保存响应并检查是否所有的响应都已收到:

浅析 es 查询文档的过程_elasticsearch_02

 couter 对象的注释如下:

/**
 * This is a simple base class to simplify fan out to shards and collect their results. Each results passed to
 * {@link #onResult(SearchPhaseResult)} will be set to the provided result array
 * where the given index is used to set the result on the array.
 */
final class CountedCollector<R extends SearchPhaseResult> {
    private final ArraySearchPhaseResults<R> resultConsumer;
    private final CountDown counter;
    private final Runnable onFinish;
    private final SearchPhaseContext context;

可以看出这是一个存储分片响应的抽象过的容器,当所有的分片响应都收到后,即 CountDown 值为 0,则可以对文档 id 进行汇总(排序,聚合):

// org.elasticsearch.action.search.QueryPhaseResultConsumer#reduce

浅析 es 查询文档的过程_sed_03

 

但是,协调节点收到的分片响应仅包含 doc id,如果要获取文档数据还得再发送一次 fetch 请求:

// org.elasticsearch.action.search.FetchSearchPhase#innerRun

浅析 es 查询文档的过程_5e_04

 当协调节点接收到所有存在数据的分片节点的 fetch 响应后,就可以发送响应给客户端了

浅析 es 查询文档的过程_elasticsearch_05

 

标签:search,final,浅析,响应,文档,分片,节点,es
From: https://blog.51cto.com/u_13971860/8052008

相关文章

  • 每日一题: 细说es6中的Reflect
    1、Reflect是什么,有什么作用?Reflect是ES6为了操作对象而新增的API,Reflect对象是一个全局的普通的对象,Reflect的原型就是Object.作用:将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上,那么以后我们就可以从Reflect对象上可以拿到语言内部的......
  • 「译文」深入了解Kubernetes和Nomad
    ......
  • (笔记)Linux环境下stress功能介绍及压力测试
     注:stress命令主要用来模拟系统负载较高时的场景,本文介绍其基本用法。一、基本语法语法格式:stress<options>常用选项:-c,--cpuN产生N个进程,每个进程都反复不停的计算随机数的平方根-i,--ioN产生N个进程,每个进程反复调用sync()......
  • InDesign 2024:创造卓越的版面设计,让排版设计焕发光彩 mac/win版
    InDesign2024,一款专为版面设计而生的强大工具,帮助创意专业人士提升排版设计的魅力。无论是杂志、报纸、书籍,还是引人入胜的视觉展示,InDesign2024都能让你在创意的海洋中自由翱翔。→→↓↓载InDesign2024mac/win版InDesign2024拥有直观的界面和强大的排版功能,可以轻松应对......
  • AtCoder Beginner Contest 216 H Random Robots
    洛谷传送门AtCoder传送门下文令\(n\)为原题中的\(K\),\(m\)为原题中的\(N\)。首先概率转方案数,最后除\(2^{nm}\)即可。考虑一个指数级暴力:枚举每个bot的终点\(y_i\)(因为存在不能相交的限制,需要满足\(y_1<y_2<\cdots<y_n\)),相当于为每个bot选一个\((0,x_i)......
  • 【技术文档】RTSP摄像头不同厂家规则
    海康摄像头rtsp规则(常见)1. rtsp://admin:[email protected]:554/h264/ch1/main/av_stream2. rtsp://admin:[email protected]:554/Streaming/Channels/101  (主码)3. rtsp://admin:[email protected]:554/Streaming/Channels/102  (子码)海康摄像头rtsp规......
  • 【技术文档】RTSP协议详解
    1 概要RTSP(RealTimeStreamingProtocol)实时流协议:一种流媒体控制协议,可对流媒体进行暂停、快进、快倒等操作。流媒体就是实时在线点播。而流媒体与普通媒体的差别在于:对于普通媒体,在访问它之前要得到全部的内容;对于流媒体,则在完全接收到全部内容之前就开始访问。本文主要介......
  • C# - 自建 SDK 的 API 文档
    在代码中添加API文档用户在使用类库时,通常需要通过VS的Intellisense或F12反编译查看API的注释,借助这些注释来了解如何使用API。在C#源文件中,可以通过编写由三斜杠表示的特殊注释字段,在代码中建立类库所需的API文档。注释字段包含用于描述其下方代码块的XML元素,X......
  • Kubernetes 迁移节点 Kubelet 数据存储目录
    1、概述默认Kubernetes节点Kubelet数据目录在/var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这可能会引发一些问题:磁盘空间限制:系统根目录通常具有较小的磁盘空间,用于操作系统文件和应用程序。将Kubelet数据与操作系统混合存储可能导致磁盘空......
  • DevExpress 换肤
    C#使用DevExpress窗体皮肤_devexpress窗体为窗体指定lookandfeel-CSDN博客摘要:本文介绍C#如何使用DevExpress组件对Winfrom程序换肤。相信很多朋友希望自己的软件可以非常漂亮,本文就简要介绍一下,对窗体换肤。1、在程序入口处,即Program.cs添加如下代码:DevExpress.UserSkins.Of......