ElasticSearch之分布式查询过程分析

写在前面

本文一起看下es分布式查询的过程。

1:分布式搜索过程

分布式搜索分为两个阶段,query和fetch,即query-then-fetch

假定primary shard=3,replica shard=1,即3个主分片,1个副本分片。

1.1:query阶段

某data node收到请求后,作为coordinate node,随机地从六个主副本分片中选择3个分片,每个data node按照得分排序后查询from+size数量的数据,coordinate node收集所有副本的数据,到这里query 阶段就结束了,如下图:
在这里插入图片描述

1.2:fetch阶段

coordinate node将所有的文档按照分数重新排序后取指定条数的文档,然后以multi get的方式从各个节点上获取详细的_source数据,如下图:
在这里插入图片描述

2:query-then-fetch可能的问题

2.1:性能问题

因为在fetch阶段每个节点都需要查询from+size个数据,当出现深度分页问题时,会影响查询速度,还有就是,因为coordinate node需要汇总来自其他多个分片的数据,所以当分片数比较多时,coordinate node的压力会比较大。

在这里插入图片描述

之前一家公司就出现过因为设置过多的主分片数,导致查询慢的问题,后来降低分片数解决。

2.2:相关度算分

每个文档的得分都是在query过程,由各个节点根据本分片的数据来独立算分的,这样就会出现一个这样的问题,那就是,当总的数据量较少时,会导致最终结果的算分偏差比较大,当然数据量大且均匀分布时一般不会由该问题,针对少数据量多分片场景下算分不准的情况可以通过如下2种方式来解决:

1:设置主分片数为1,实际上少量的数据,也确实没必要设置>1个的分片。
2:查询时增加参数_search?search_type=dfs_query_then_fetch,此时在fetch阶段会将所有的问题重新算分,再获取从from开始的size条数据。

2.2.1:例子

首先我们来创建索引,并插入3条测试数据:

DELETE message

POST message/_doc
{
  "content": "good"
}

POST message/_doc
{
  "content": "good morning"
}

POST message/_doc
{
  "content": "good morning everyone"
}

因为我们并没有显式指定分区数,使用的是默认的分区数1,所以此时查询,算分是正确的,如下:

POST message/_search
{
    "query": {
        "term": {
            "content": {
                "value": "good"
            }
        }
    }
}

在这里插入图片描述
然后我们重新创建数据,并指定分区数为20(>1即可,但为了降低测试数据分配到同一个分区可能性,影响测试结果,所以给个稍微大一点的值),如下:

DELETE message

PUT message
{
  "settings": {
    "number_of_shards": 20
  }
}

POST message/_doc?routing=1
{
  "content": "good"
}

POST message/_doc?routing=2
{
  "content": "good morning"
}

POST message/_doc?routing=3
{
  "content": "good morning everyone"
}

先来看下数据所在的分区信息:
在这里插入图片描述
可以看到3条数据分别分布在了2,14,和17分区。接着我们就可以来查询,看下评分的结果是否正确了:

POST message/_search
{
    "query": {
        "term": {
            "content": {
                "value": "good"
            }
        }
    }
}

在这里插入图片描述
可以看到评分都相同了,就复现了少量数据评分不准确的问题了,接着增加参数_search?search_type=dfs_query_then_fetch看下:
在这里插入图片描述
评分结果就对了。但是需要注意该参数,会增加coordinate node的压力,消耗更多的CPU和处理时长,也可能有性能问题。

写在后面

参考文章列表

什么是MySQL深度分页问题如何解决? 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树——700. 二叉搜索树中的搜索、98. 验证二叉搜索树

二叉搜索树中的搜索 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val 2 …

【论文精读】基于知识图谱关系路径的多跳智能问答模型研究

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

96道前端面试题,前端开发工作内容

HTML、CSS、JS三大部分都起什么作用? HTML内容层,它的作用是表示一个HTML标签在页面里是个什么角色;CSS样式层,它的作用是表示一块内容以什么样的样式(字体、大小、颜色、宽高等)显示;JS行为层…

js形参传递特殊字符

在前端我们给其他页面传值或者传数据到后台的时候,字符串经常将一些特殊符号识别成字符集。这种情况下会将数据打断或者打乱,比如字符串里面包含*/&这些符号的时候就会错误。 我们可以通过将字符中的特殊字符替换成十六进制的字符,一些特…

【详识JAVA语言】String类2

常用方法 字符串的不可变性 String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为: 1. String类在设计时就是不可改变的,String类实现描述中已经说明了 以下来自JDK1.8中String类的部分实现: String类…

马士超:符合国际标准的沉浸式音频HOLOSOUND的发展与未来 | 演讲嘉宾公布

一、3D音频 3D 音频分论坛将于3月27日同期举办! 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验,跨越时空的限制,探索未知的世界。同时,提供更加丰富、立体的情感表达和交流方式,让人类能够更加深入地理解彼此&a…

【Python 识别某滑块的距离】今天来换思维搞滑块,不用识别库,几行代码就能搞定,仅供学习

写作日期:2024.03.05 使用工具:Python 温馨提示:此方法仅对有完整图和缺口图的滑块有效,可精准识别出缺口要滑动的距离 文章全程已做去敏处理!!! 【需要做的可联系我】 AES处理(直接…

2024-3-5 python 序列小知识点

1、for循环的变量作用域不限于for循环内 >>>i 10 >>>for i in range(100): >>> print(i) >>> i 100此处,for循环里的 i 修改了之前的 i 变量的值。 2、列表推导式里的变量作用域仅限于推导式内 推导式犹如一个函数&…

SpringCloud-用nacos做服务注册与调用

步骤1:下载和安装Nacos 首先,你需要从Nacos的官方网站上下载并安装Nacos Server。根据你的操作系统选择合适的版本,并按照官方文档中的说明进行安装和配置。 步骤2:创建Spring Boot项目 在你喜欢的IDE中创建一个新的Spring Boot项…

表格制作一对多,多对多

<!-- <tr><td>第1行第1列</td><td>第1行第2列</td></tr><tr><td rowspan"4">第2行第1列</td><td colspan"2">第2行第2列</td><td colspan"3">第2行第2列</td>…

Nodejs 第四十六章(redis持久化)

redis持久化 Redis提供两种持久化方式&#xff1a; RDB&#xff08;Redis Database&#xff09;持久化&#xff1a;RDB是一种快照的形式&#xff0c;它会将内存中的数据定期保存到磁盘上。可以通过配置Redis服务器&#xff0c;设置自动触发RDB快照的条件&#xff0c;比如在指…

消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

服务端处理架构 资料来源于网络 网络线程池&#xff1a; 接受请求&#xff0c;num.network.threads&#xff0c;默认为 3&#xff0c;专门处理客户的发送的请求。 IO 线程池&#xff1a; num.io.threads&#xff0c;默认为 8&#xff0c;专门处理业务请求。也就是它不负责发…

[网鼎杯 2020 半决赛]AliceWebsite --不会编程的崽

网鼎杯某些题还是很简单嘛&#xff0c;比如这题 有交互界面先去交互看看 斯&#xff0c;actionabout.php?有一种可能是存在任意文件读取,试一下/etc/passwd 看来猜想正确&#xff0c;直接读取根目录的flag

001-JS数据类型及判断

JS数据类型及判断 1、数据类型2、数据类型判断方法3、JS的假值 1、数据类型 JavaScript 包含 6 中基本数据类型 和 引用类型&#xff1a; 6种基本类型&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、空&#xff08;Null&#xff09;、未定义…

Nginx使用—http基础知识

web访问流程 当我们在客户端通过浏览器输入网址的时候&#xff0c;这时候是访问不到服务器的&#xff0c; 先会去找到DNS解析服务器&#xff0c;DNS解析服务器返回IP地址&#xff0c; 客户端通过http协议向服务端发送请求&#xff0c;服务器响应请求并返回对应的资源给客户端&a…

RS232串口硬件调试

视频链接&#xff08;1~4&#xff09; RS232串口硬件调试01---串口理论及报文格式_哔哩哔哩_bilibili RS232串口硬件调试02---示波器抓取串口波形_哔哩哔哩_bilibili RS232串口硬件调试03---串口波形解析_哔哩哔哩_bilibili RS232串口硬件调试04---串口bug如何解决_哔哩哔哩…

Cookie和session 及Web相关工具

一 Cookie &#xff08;一&#xff09;介绍 Cookie 又称为"小甜饼”。类型为"小型文本文件”&#xff0c;指某些网站为了辨别用户身份而储存在用户本地终端&#xff08;Client Side&#xff09;上的数据&#xff08;通常经过加密&#xff09;。由网景公司的前雇员…

C++ 创建链表并输出

目录 代码实现 输出结果 代码实现 #include <stdio.h> #include <stdlib.h> //#include <cstdio> //#include <vector> #include<iostream> #include<cstdlib> using namespace std;//定义一个结构体 ListNode的结构 struct ListNode…

保姆教程 Docker 部署微服务项目

大家好&#xff0c;我是奇兵。 文章比较长&#xff0c;请耐心看完&#xff01; 项目上线是每位学编程同学必须掌握的基本技能。之前我已经给大家分享过很多种上线单体项目的方法了&#xff0c;今天再出一期微服务项目的部署教程&#xff0c;用一种最简单的方法&#xff0c;带…

linux无法启动dhcp服务--Failed to start DHCPv4 Server Daemon.错误

linux dhcp服务搭建详细过程请看 linux系统dhcp服务部署 关于dhcp服务无法启动Failed to start DHCPv4 Server Daemon.错误 解决方法&#xff1a;虚拟网络编辑器中的也就是dhcp所要服务的子网ip地址要与dhcp.conf中的服务网段ip一致&#xff08;与上面subnet 192.168.1.0一致…