Elasticsearch聚合之sum_other_doc_count问题

本文分析了Elasticsearch中聚合统计出现精度问题的原因,并提出了两种解决方案:一是通过不分片设置来避免分片处理引起的误差;二是通过提高聚合的数量来增加统计的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题分析

1)、doc_count_error_upper_bound:表示没有在这次聚合中返回,但是可能存在的潜在聚合结果。
2)、sum_other_doc_count:表示这次聚合中没有统计到的文档数。这个好理解,因为ES统计的时候默认只会根据count显示排名前十的分桶。如果分类(这里是目的地)比较多,自然会有文档没有被统计到。

二、解决办法

1)、不分片
设置主分片为1,也就是不分片了。这个显而易见,上面分析聚合不精确的核心原因就在于分片,所以不分片肯定可以解决问题。但是缺点也是显然的,只适用于数据量小的情况下,如果数据量大都在一个分片上会影响ES的性能。

GET kibana_sample_data_flights/_search
{
“size”: 0,
“aggs”: {
“dest”: {
“terms”: {
“field”: “DestCountry”
, “size”: 3
}
}
}
}

结果:

{
“took” : 2,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 10000,
“relation” : “gte”
},
“max_score” : null,
“hits” : [ ]
},
“aggregations” : {
“dest” : {
“doc_count_error_upper_bound” : 0,
“sum_other_doc_count” : 7605,
“buckets” : [
{
“key” : “IT”,
“doc_count” : 2371
}

2)、提高聚合的数量
如下所示,把size设置成20(ES默认情况是10)聚合查询。size是指定聚合返回的结果数量。返回的结果越多,精确度肯定就越高。

GET my_flights/_search
{
“size”: 0,
“aggs”: {
“dest”: {
“terms”: {
“field”: “DestCountry”
, “size”: 20
}
}
}
}

结果:

“aggregations” : {
“dest” : {
“doc_count_error_upper_bound” : 0,
“sum_other_doc_count” : 571,
“buckets” : [
{
“key” : “IT”,
“doc_count” : 2371
}

三、总结

1、ES某些聚合统计会存在损失精准度的问题
2、损失精准度的原因是分片处理中间结果,汇总引起的误差,是ES实时性和精准度的权衡
3、可以通过调大shard_size等方法增加精准度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值