网站建设内容模板下载,淘宝流量助手平台,怎么下载ppt模板,杭州做网站要多少钱Elasticsearch 聚合数据结果不精确
背景
近期我们项目中出现使用ES聚合某个索引的数据取TOP 10的数据和相同条件下查询所有数据然后按数据量排序取的TOP 10的数据不一致的问题。
下面我们简单分析一下这个问题#xff0c;列出一些常见的解决方案。
问题
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?spm1001.2014.3001.5506
问题分析 期望结果
c 40, a 40 , d 35
实际结果
d 35, c 35, a 30
导致聚合不精确的原因分析
效率因素每个分片的取值Top X并不是汇总全部的 TOP X。性能因素ES 可以不每个分片Top X而是全量聚合但势必这会有很大的性能问题。
解决方案
提高聚合的精确度
size是聚合结果的返回值客户期望返回聚合排名10size值就是 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_miscrequest_id6783e0d839e34d91ac465bedac26b860biz_idutm_mediumdistribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-107133008-null-null.268v1controlutm_term%E8%81%9A%E5%90%88%E4%B8%8D%E5%87%86spm1018.2226.3001.4450