Elasticsearch 聚合数据结果不精确问题解决方案
Elasticsearch 聚合数据结果不精确
背景
近期我们项目中出现使用ES聚合某个索引的数据取TOP 10的数据和相同条件下查询所有数据然后按数据量排序取的TOP 10的数据不一致的问题。
下面我们简单分析一下这个问题,列出一些常见的解决方案。
问题
Elasticsearch分片机制
Elasticsearch索引(index)有一个主分片(primary shard)和0个或者多个分片副本组成。

Elasticsearch检索/聚合数据
query then fetch
query阶段:
- 客户端将请求发到协调节点(coordinate node);
- 协调节点将搜索请求广播到所有的primary shard 或者 replica。
- 每个shard在本地执行搜索并构建一个匹配文档大小为from + size的优先队列,每个分片返回各自优先队列中所有的docId和打分值个协调节点。
- 协调节点对各个分片分片返回的数据进行合并,排序,分页等操作,产出最终的结果集。
fetch阶段:
- 协调节点根据Query阶段产生的结果,去各个节点上查询docId实际的文档内容,最终有协调节点返回结果给客户端。
- coordinate node 对 doc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin 随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。
- 接收请求的 node 返回 document 给 coordinate node 。
- coordinate node 返回 document 给客户端。
参考
https://www.elastic.co/cn/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch
https://blog.csdn.net/a745233700/article/details/115585342?spm=1001.2014.3001.5506
问题分析

期望结果:
c = 40, a = 40 , d = 35
实际结果:
d = 35, c = 35, a = 30
导致聚合不精确的原因分析:
- 效率因素:每个分片的取值Top X,并不是汇总全部的 TOP X。
- 性能因素:ES 可以不每个分片Top X,而是全量聚合,但势必这会有很大的性能问题。
解决方案
提高聚合的精确度
size:是聚合结果的返回值,客户期望返回聚合排名10,size值就是 10。
shard_size: 每个分片上聚合的数据条数。shard_size 原则上要大于等于 size(若设置小于size,实则没有意义,elasticsearch 会默认置为size)
请求的size值越高,结果将越准确,但计算最终结果的成本也将越高。
方案
- 调大 shard_size的值
官方推荐: size * 1.5 + 10
使用场景:数据量大、分片数多的集群业务场景
shard_size 值越大,结果越趋近于精准聚合结果值。
此外,还可以通过show_term_doc_count_error参数显示最差情况下的错误值,用于辅助确定 shard_size 大小。
- 全量聚合(不推荐)
将size设置为分片支持的最大值来解决聚合的精度问题。
缺点:当分片的数据量极大,会消耗巨大的cpu用于对数据的计算排序,对性能有较大影响。
参考:https://blog.csdn.net/laoyang360/article/details/107133008?ops_request_misc=&request_id=6783e0d839e34d91ac465bedac26b860&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-107133008-null-null.268v1control&utm_term=%E8%81%9A%E5%90%88%E4%B8%8D%E5%87%86&spm=1018.2226.3001.4450
相关文章:
Elasticsearch 聚合数据结果不精确问题解决方案
Elasticsearch 聚合数据结果不精确 背景 近期我们项目中出现使用ES聚合某个索引的数据取TOP 10的数据和相同条件下查询所有数据然后按数据量排序取的TOP 10的数据不一致的问题。 下面我们简单分析一下这个问题,列出一些常见的解决方案。 问题 Elasticsearch分片…...
Qt经典面试题:Qt开启线程的几种方式
方法一:从QThread类派生 ①创建一个类从QThread类派生 ②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程,调用start()函数 这种方法涉及到创建一个从QThread类派生的子类,并在该子类中重写run()函数。处理操…...
使用chartgtp写Android代码
<LinearLayout android:layout_width"match_parent" android:layout_height"match_parent" android:orientation"horizontal"> <TextView android:id"id/姓名" …...
【C++】4.jsoncpp库:jsoncpp库安装与使用入门
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍jsoncpp的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&am…...
HTML、CSS、 JavaScript介绍(二)
CSS 指层叠样式表 (Cascading Style Sheets),CSS定义如何显示 HTML 元素。HTML 标签原本被设计为用于定义文档内容,样式表定义如何显示 HTML 元素,就像 HTML 中的字体标签和颜色属性所起的作用那样。样式通常保存在外部的 .css 文件中。我们只…...
高效益的淘客APP要怎么开发,需要哪些功能
现在各大淘客app都有移动端的app,但是一直不知道如何推广出去。客app想要赚钱,要思考怎么推广淘客app,推广适用于非常执行力的人。淘客app推广首要第一条,产品要好,app要好,返利要高,用户才会使…...
Java基础--->IO流(2)【常见IO模型】
文章目录 计算机角度IO操作系统IO常见的IO模型Java 中 3 种常见 IO 模型BIO(BlockingI/O)【同步阻塞IO】NIO(Non-blocking/New I/O)【非阻塞IO】IO多路复用AIO(Asynchronous I/O)【异步IO】 计算机角度IO 根…...
JavaScript let 和 const
在JavaScript中,let和const是用于声明变量的关键字。 let关键字用于声明一个块级作用域的变量。块级作用域是指在一个代码块(通常是在花括号 {} 内部)中声明的变量只在该代码块内部有效。例如: javascript function example() {…...
云原生下多集群的监控系统背景、架构设计与实现
随着云原生技术的普及,越来越多的企业开始采用多集群部署方案来提高系统的可用性和灵活性。在这种情况下,如何有效地监控多个集群的运行状态,成为了云原生架构下的一个重要问题。 多集群监控系统需要考虑以下几个方面的问题: 监…...
利用OpenCV处理图像
OpenCV是非常流行的图像处理库,下面介绍一下其对图像的基本操作。 1. 安装与环境 安装还有点儿复杂的,但百度几篇博客基本能解决,这里就不多说了。 安装好后,要在工程中使用OpenCV的头文件和库,需要在CMakeLists.tx…...
【面试实战】SpringIoC、AOP、MVC面试实战
version:1.0 文章目录 SpringSpring基础 / IoC🙎♂️面试官:举例Spring的模块?🙎♂️面试官:Spring、SpringMVC、Spring Boot关系?🙎♂️面试官:说说对SpringIoC的了解?🙎♂️面试官:什么是Spring Bean?🙎♂️面试官:Bean的作用域?🙎♂️面…...
[Redis 分布式锁 ]
目录 前言: 使用场景: 基于 Redis 实现分布式锁的详细示例: 使用示例: 依赖: Redis分布式锁控制并发访问: 前言: 记录一些小笔记 , 如果对你有帮助 那就更好了 使用场景: Redis 实现分布式锁的使用场景包括: 防止重复操作…...
如何创建Vue实例?Vue实例有哪些属性和方法
Vue实例就是Vue的实例化对象,就像你有一个iPhone,那么iPhone就是你的实例化对象。要创建Vue实例,就像你想拥有一部iPhone一样,首先要有一个设计图。 这个设计图就相当于Vue实例的options对象,你可以设置它的属性&…...
InnoDB Cluster集群Mysql Router代理层最佳实践
InnoDB Cluster 集群 & Mysql-Router 代理层 前言 Mysql是现今最常用的关系型数据库之一,高可用一直是我们对软件服务的要求。常见的Mysql高可用是主从配置,在主节点挂掉后需要依赖监控脚本进行主从切换将从节点升级,后台服务代码层面也…...
RabbitMQ系列-概念及安装
1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信 而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的…...
进程间通信之共享内存
进程间通信之共享内存 1.共享内存机制2.两种常用共享内存方式3.补充一下:linux中shm与shmm的区别4.IPC通信System V版本的共享内存shm5.存储映射共享I/O(mmap函数)1.共享内存机制 是允许两个或多个进程(不相关或有亲缘关系)访问同一个逻辑内存的机制。它是共享和传递数据的一…...
网络连接中的舔狗协议
舔狗网络协议 (discard protocol) 最近互联网上,“舔狗” 这个词语很火,也衍生出来很多梗(快速说出互联网 4 大舔狗!!!)。然后今天偶然间看到了一个 RFC 文档, 发现了一…...
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
大家好,我是冰点,今天给大家带来,关于MySQL中的锁的使用。 我首先提个问题,大家知道什么是 乐观锁、悲观锁、共享锁,、排它锁、行锁、表锁,以及每种锁的使用场景吗? !! 背景:最近在各…...
【C++】C++ 中的 IO 流
文章目录 一、C语言的输入输出二、什么是流三、C IO 流1、C 标准 IO 流2、C 文件 IO 流 四、stringstream 介绍 一、C语言的输入输出 在C语言中我们使用最频繁的输入输出方式是 scanf () 与 printf(): scanf():从标准输入设备 (键盘) 读取数据…...
QFuture的使用
QFuture 是 Qt 提供的一个类,用于表示异步操作的返回值或状态。异步操作指的是那些不会阻塞主线程的操作,例如文件读写、网络请求、计算等等。 在执行异步操作时,可以使用 QtConcurrent 模块提供的函数 (QFuture<T> QtConcurrent::run…...
为什么83%的Gemini CSR活动陷入“形式主义陷阱”?顶级科技公司首席可持续官亲述3个致命断层与修复路径
更多请点击: https://codechina.net 第一章:Gemini CSR活动策划的底层逻辑重构 传统CSR(企业社会责任)活动策划常陷于“项目驱动”与“KPI导向”的线性思维,而Gemini平台引入的CSR框架则以AI原生协同为前提࿰…...
初次使用Taotoken,从注册到成功发起第一次API调用的全过程
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次使用Taotoken,从注册到成功发起第一次API调用的全过程 对于初次接触大模型API的开发者而言,从注册平台…...
学术 PPT 创作提速方案:九款 AI 工具,轻松攻克毕业答辩制作难题
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPTAI PPT制作 - Okbiye智能写作https://www.okbiye.com/ppt 毕业答辩阶段,演示文稿制作成为多数学子耗时耗力的一大关卡。梳理论文脉络、匹配专业模板、规整内容排版、优化数据展示࿰…...
将 Hermes Agent 的后端服务切换至 Taotoken 提供模型支持
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将 Hermes Agent 的后端服务切换至 Taotoken 提供模型支持 如果你正在使用 Hermes Agent 框架进行 AI 应用开发,并且希…...
10分钟掌握AppImageLauncher:让Linux应用管理像Windows一样简单的完整指南
10分钟掌握AppImageLauncher:让Linux应用管理像Windows一样简单的完整指南 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: http…...
Play Integrity API Checker:构建企业级Android安全防御体系的技术架构与商业价值
Play Integrity API Checker:构建企业级Android安全防御体系的技术架构与商业价值 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integ…...
告别手动字幕!3步用VideoSrt实现视频自动字幕生成
告别手动字幕!3步用VideoSrt实现视频自动字幕生成 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 还在为视频字幕制作而烦…...
BiliBiliCCSubtitle终极指南:如何3秒下载B站CC字幕并转换SRT格式
BiliBiliCCSubtitle终极指南:如何3秒下载B站CC字幕并转换SRT格式 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为无法下载B站CC字幕而烦恼吗&am…...
HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰
HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在玩HoneySe…...
量子电路优化:ZX计算与强化学习的融合实践
1. 量子电路优化背景与挑战在NISQ(Noisy Intermediate-Scale Quantum)时代,量子计算机面临的最大瓶颈是量子比特的相干时间有限和门操作的高错误率。其中两比特门(如CNOT门)的错误率通常比单比特门高出一个数量级&…...
