Elasticsearch 聚合数据结果不精确问题解决方案

news/2025/2/14 8:01:39/

Elasticsearch 聚合数据结果不精确

背景

近期我们项目中出现使用ES聚合某个索引的数据取TOP 10的数据和相同条件下查询所有数据然后按数据量排序取的TOP 10的数据不一致的问题。

下面我们简单分析一下这个问题,列出一些常见的解决方案。

问题

Elasticsearch分片机制

Elasticsearch索引(index)有一个主分片(primary shard)和0个或者多个分片副本组成。

在这里插入图片描述

Elasticsearch检索/聚合数据

query then fetch

query阶段:

  1. 客户端将请求发到协调节点(coordinate node);
  2. 协调节点将搜索请求广播到所有的primary shard 或者 replica。
  3. 每个shard在本地执行搜索并构建一个匹配文档大小为from + size的优先队列,每个分片返回各自优先队列中所有的docId和打分值个协调节点。
  4. 协调节点对各个分片分片返回的数据进行合并,排序,分页等操作,产出最终的结果集。

fetch阶段:

  1. 协调节点根据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


http://www.ppmy.cn/news/167547.html

相关文章

使用HHDBCS的SSH通道登陆数据库

传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。 随着人们对网络安全的重视,SSH协议已经越来越被用户所青睐。 SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了…

分享几个索引创建的小 Tips

文章目录 1. 冗余索引1.1 联合索引左边列1.2 索引中加入主键 2. 隐藏的索引排序3. 删除不使用的索引4. 手动更新索引统计信息5. 适时优化表 关于 MySQL 中的索引,松哥前面已经和小伙伴们聊了不少了,不过在索引使用的时候,还是有一些需要注意的…

ESTJ型人格的性格缺陷和心理问题分析

ESTJ型人格是一种稳健、务实、具有领导才能的人格类型。他们喜欢按照既定的规则和程序去做事,注重细节和实际效果,对于不确定性和变化经常感到不安。然而ESTJ型人格也存在一些性格缺陷和心理健康问题。 ESTJ型人格可能存在的性格缺陷 1. 思维模式狭隘 …

获取拼音-pinyin.js

/* --- 中文转拼音 获取首字母 ... */ let pinyin function pinyin() {var Pinyin function (ops) {this.initialize(ops);},options {checkPolyphone: false,charcase: default};Pinyin.fn Pinyin.prototype {init: function (ops) {this.options extend(options, ops);…

【工具笔记】java 中文替换,用于简单的中文替换脱敏加密,且保留模糊查询特性

项目需要,用户姓名需要支持模糊查询,但是要支持姓名脱敏。 1、根据中文字典生成,密码本文件【只需生成一次】。 2、将密码本加载在内存中。 3、将中文进行替换和还原。 import java.io.BufferedReader; import java.io.BufferedWriter; i…

服务器踩坑记(Ubuntu18)

服务器踩坑记(Ubuntu18)(持续更新) jupyter 与 python2 编码不兼容问题 $ LANGzn jupyter lab docker 容器相关 $ docker run -it --name [container_name] -p [server_port]:[container_port] --runtimenvidia --network [d…

Web渗透测试-Xss跨站脚本攻击(Cross Site Scripting)

Xss跨站脚本攻击 Xss通用明文 &&表单劫持跨站脚本攻击漏洞概念,漏洞原理和危害,掌握反射型、存储型XSS漏洞利用方法 web安全工程师-03-XSS漏洞原理与利用 第一章:XSS基础1.1 XSS介绍与原理~11.2 存储型XSS实战1.3 反射型XSS实战1.4 D…

Win7系统IE、搜狗等浏览器首页被恶意网址qq789.com.cn劫持……

刚才,一位朋友的Windows7 电脑中IE、搜狗等浏览器首页被qq789.com.cn劫持,请我通过QQ远程协助帮忙解决。 右击朋友电脑桌面上的Internet Explorer图标,从弹出的菜单中选择“属性”,弹出的“Internet 属性”窗口是这样的&#xff1…