如何在 Elasticsearch 中获取聚合桶的总数?

How to get total number of aggregation buckets in Elasticsearch?

我使用 Elasticsearch 术语聚合来查看有多少文档在其“foo”字段中具有特定值,如下所示:

{
    ...
    "aggregations": {
        "metastore": { 
            "terms": { 
                "field": "foo",
                "size": 50 
            }
        }
    }
}

我得到回复:

 "aggregations": {
      "foo": {
            "buckets": [
                {
                    "key_as_string": "2018-10-01T00:00:00.000Z",
                    "key": 1538352000000,
                    "doc_count": 935
                },
                {
                    "key_as_string": "2018-11-01T00:00:00.000Z",
                    "key": 1541030400000,
                    "doc_count": 15839
                },
                ...
                /* 48 more values */
             ]
      }
 }

但我将不同值的数量限制为 50 个。如果此字段中有更多不同值,它们将不会在响应中返回,这没关系,因为我不需要全部他们,但我想知道他们有多少人。那么,我怎样才能得到不同值的总数呢?如果答案提供完整的示例查询,那就太好了,谢谢。

cardinality aggregation is there to help. Just note, however, that the number that is returned is an approximation 可能无法反映您在请求所有存储桶时获得的存储桶的确切数量。但是,在低基数字段上的准确性非常好。

{
    ...
    "aggregations": {
        "unique_count": {
          "cardinality": {
            "field": "foo"
          }
        },
        "metastore": { 
            "terms": { 
                "field": "foo",
                "size": 50 
            }
        }
    }
}

您或许可以添加一个 cardinality aggregation,这将为您提供该字段的唯一术语数。这将等于术语聚合的桶数。

{
    ...
    "aggregations": {
        "metastore": { 
            "terms": { 
                "field": "foo",
                "size": 50 
            }
        },
        "uniquefoo": {
          "cardinality": {
            "field": "foo"
          }
        }
    }
}

注意:请记住基数聚合在某些情况下可能 return 近似计数。要了解更多信息,请阅读 here