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

这篇具有很好参考价值的文章主要介绍了Elasticsearch 聚合数据结果不精确问题解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Elasticsearch 聚合数据结果不精确

背景

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

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

问题

Elasticsearch分片机制

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

es聚合查询不准确,elasticsearch,大数据,搜索引擎

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

问题分析

es聚合查询不准确,elasticsearch,大数据,搜索引擎

期望结果:

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用于对数据的计算排序,对性能有较大影响。
其他OLAP数据库
ClickHouse:对于追加类型的数据,如:日志数据,用户行为数据查询 聚合非常快
StarRocks:支持明细,聚合,更新,主键模型。

参考: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文章来源地址https://www.toymoban.com/news/detail-672246.html

到了这里,关于Elasticsearch 聚合数据结果不精确问题解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • es elasticsearch 十四 各种机制 评分机制 正序索引 解决跳跃结果问题 解决耗时过长问题 解决相同属性值都到一个地方

    目录 评分机制 机制 查看评分实现如何算出来的explain=true 分析能否被搜索到 Doc value 正排序索引 Query phase Fetch phase Preference 问题 解决跳跃结果问题 Timeout 到达时间直接返回,解决耗时过长问题 Routing 数据准确分配到某地,解决相同属性值都到一个地方 评分机制 机制 TF分词频

    2024年02月08日
    浏览(77)
  • Elasticsearch解决不能修改索引、字段问题解决方案

    问题1: 由于es索引不能删除,不能修改,在不影响原数据的情况下,并且生产服务不停机的情况下,怎么修改索引,并保留原索引内的数据? 基于kibanna的dev Tools执行参数,淘汰postman,kibanna会有提示 1、原来索引起别名job 2、重建索引,数据迁移,默认是同步执行大数据量太

    2024年02月12日
    浏览(45)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(70)
  • Elasticsearch 线上实战问题及解决方案探讨

    1.1 问题描述 我有 1tb 的一个大索引若干,要迁移到另外一个新集群去,有没有好办法?reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断,而且没地方查到错误? 1000多万 的数据,大概 80G  用 reindex 有时候都会莫名的断。 有时候是全的,有时候不全。 http

    2024年02月05日
    浏览(49)
  • 安装Elasticsearch步骤(包含遇到的问题及解决方案)

    注: 笔者是在 centos 云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch  3.启动Elasticsearch 非常容易出问题  第一次运行时,可能出现如下错误: 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自动被killed 四、max virtual memory areas vm.max_map_c

    2024年02月06日
    浏览(65)
  • 使用Docker安装和部署Elasticsearch出现问题以及解决方案

    docker安装elasticsearch(最详细版)| Bright1668-CSDN es在Windows环境启动报错 | 你道本部院是个书生-CSDN 查看max_map_count的值 默认是 65530 。 重新设置max_map_count的值。 –name es:设置容器的名称为\\\"es\\\"。 -p 9200:9200 -p 9300:9300:这部分将主机的端口与容器的端口进行映射。 -e “discovery.ty

    2024年02月09日
    浏览(58)
  • Elasticsearch部署中的两大常见问题及其解决方案

    随着大数据和实时搜索的日益普及,Elasticsearch已经成为现代应用中不可或缺的工具。但是,像所有软件一样,部署和配置Elasticsearch可能会遇到一些问题。本文将探讨两个我最近遇到的常见问题及其解决方案。 在启动Elasticsearch时,我遇到了以下错误: failed to resolve host [“l

    2024年02月06日
    浏览(54)
  • ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

    目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关性算分 1.5.2、function_score 1.5.3、boolean query 1.6、搜索

    2024年02月07日
    浏览(50)
  • 【ElasticSearch】深入探索 ElasticSearch 对数据的聚合、查询自动补全、与数据库间的同步问题以及使用 RabbitMQ 实现与数据库间的同步

    在本文中,我们将深入探讨 ElasticSearch 在数据处理中的关键功能,包括数据聚合、查询自动补全以及与数据库的同步问题。 首先,我们将聚焦于 ElasticSearch 强大的聚合功能,解释什么是聚合以及如何通过 DSL 语句和 RestClient 实现各种聚合操作。这一功能能够让我们更深入地了

    2024年02月08日
    浏览(57)
  • elasticsearch7.5.2 数据迁移解决方案

    1. 迁移旧数据 a. 查看ES数据文件挂载目录位置 容器内路径: /usr/share/elasticsearch/data 如果没有挂载,需要将/usr/share/elasticsearch/data 压缩后,文件拷到宿主机上 bash # docker cp [容器名称:文件路径] [宿主机路径] b. 将data.tar.gz 上传至B服务器 迁移es数据文件至B服务器 /root 下 新增

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包