身安不如心安,屋宽不如心宽 。

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执行聚合的过程。恳请大佬们帮忙分析一下问题
已邀请:

guoyanbiao520

赞同来自:

cardinality 超出一定数量本来就不能精确聚合,除非你只有一个分片~

要回复问题请先登录注册