histogram桶数量累加和cardinality统计的值不一致(cardinality的原因,和bucket_selector没关系,感谢guoyanbiao520)
Elasticsearch | 作者 aiolos | 发布于2021年02月01日 | 阅读数:2610
bucket_selector没有关系,这个问题很愚蠢。cardinality本身就是近似值,precision_threshold最大值40000,默认值3000。我多次改大precision_threshold之后,统计值不再变化,我想当然认为cardinality是准确的值。稍后我再用单分片验证以下。
测试结果cardinality和分片没有关系。
感谢guoyanbiao520
------------------------------------------------------错误的问题的分割线------------------------------------------------------------bucket_selector后的桶数量累加和cardinality统计的值不一致。恳请大佬们帮忙分析一下问题
我用bucket_selector统计字段中重复分别出现"5次以下的"和"6次以上的"的值的数量,加起来和cardinality的值不一致。统计字段名称为'did',类型为keyword类型。下面的查询都不贴查询条件了
条件查询后用cardinality统计文档数量和单独的值的个数
{
"track_total_hits": true,
"aggs": {
"did_count": {
"cardinality": {
"precision_threshold": 655350,
"field": "did"
}
}
}
}
结果显示命中的文档数为: 13088251,单独的值为4470874个
{
"hits": {
"total": {
"value": 13088251,
"relation": "eq"
}
},
"aggregations": {
"did_count": {
"value": 4470874
}
}
}
用bucket_selector分别统计桶个数的查询如下(查询出现1-5次的值的个数)。同样不贴查询条件了
{
"aggregations": {
"termAgg*-5": {
"terms": {
"field": "did",
"size": 2147483647,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
],
"collect_mode": "breadth_first"
},
"aggregations": {
"selector*-5": {
"bucket_selector": {
"buckets_path": {
"count": "_count"
},
"script": {
"source": "params.count <= 5 ",
"lang": "painless"
},
"gap_policy": "skip"
}
}
}
},
"stat*-5": {
"stats_bucket": {
"buckets_path": [
"termAgg*-5._count"
],
"gap_policy": "skip"
}
}
}
}
然后5次一下的和6次以上的出现以下结果
{
"aggregations": {
"stat*-5": {
"count": 4221539,
"min": 1,
"max": 5,
"avg": 1.6963280452934344,
"sum": 7161115
}
}
}
{
"aggregations": {
"stat6-*": {
"count": 248689,
"min": 6,
"max": 3266971,
"avg": 23.833527015670175,
"sum": 5927136
}
}
}
5次以下的和6次以上的加和(4221539+248689=4,470,228)与cardinality值(4470874)不一致。但是命中的文档数是一致的(7161115+5927136=13088251)。我再次用bucket_selector中以"params.count > 0"统计,结果与"5次以下的"和"6次以上的"加和一致。
另外我在一个40000文档的测试索引上执行查询。bucket_selector 和 cardinality的值是一致的。
我不太了解es执行聚合的过程。恳请大佬们帮忙分析一下问题
测试结果cardinality和分片没有关系。
感谢guoyanbiao520
------------------------------------------------------错误的问题的分割线------------------------------------------------------------bucket_selector后的桶数量累加和cardinality统计的值不一致。恳请大佬们帮忙分析一下问题
我用bucket_selector统计字段中重复分别出现"5次以下的"和"6次以上的"的值的数量,加起来和cardinality的值不一致。统计字段名称为'did',类型为keyword类型。下面的查询都不贴查询条件了
条件查询后用cardinality统计文档数量和单独的值的个数
{
"track_total_hits": true,
"aggs": {
"did_count": {
"cardinality": {
"precision_threshold": 655350,
"field": "did"
}
}
}
}
结果显示命中的文档数为: 13088251,单独的值为4470874个
{
"hits": {
"total": {
"value": 13088251,
"relation": "eq"
}
},
"aggregations": {
"did_count": {
"value": 4470874
}
}
}
用bucket_selector分别统计桶个数的查询如下(查询出现1-5次的值的个数)。同样不贴查询条件了
{
"aggregations": {
"termAgg*-5": {
"terms": {
"field": "did",
"size": 2147483647,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
],
"collect_mode": "breadth_first"
},
"aggregations": {
"selector*-5": {
"bucket_selector": {
"buckets_path": {
"count": "_count"
},
"script": {
"source": "params.count <= 5 ",
"lang": "painless"
},
"gap_policy": "skip"
}
}
}
},
"stat*-5": {
"stats_bucket": {
"buckets_path": [
"termAgg*-5._count"
],
"gap_policy": "skip"
}
}
}
}
然后5次一下的和6次以上的出现以下结果
{
"aggregations": {
"stat*-5": {
"count": 4221539,
"min": 1,
"max": 5,
"avg": 1.6963280452934344,
"sum": 7161115
}
}
}
{
"aggregations": {
"stat6-*": {
"count": 248689,
"min": 6,
"max": 3266971,
"avg": 23.833527015670175,
"sum": 5927136
}
}
}
5次以下的和6次以上的加和(4221539+248689=4,470,228)与cardinality值(4470874)不一致。但是命中的文档数是一致的(7161115+5927136=13088251)。我再次用bucket_selector中以"params.count > 0"统计,结果与"5次以下的"和"6次以上的"加和一致。
另外我在一个40000文档的测试索引上执行查询。bucket_selector 和 cardinality的值是一致的。
我不太了解es执行聚合的过程。恳请大佬们帮忙分析一下问题
1 个回复
guoyanbiao520
赞同来自: