累积基数(cumulative_cardinality)聚合

一种父管道聚合,用于计算父直方图(或日期直方图date_histogram)聚合中的累积基数。 指定的度量必须是一个基数聚合,并且封闭直方图必须将min_doc_count设置为0(histogram聚合的默认值)。

cumulative_cardinality聚合对于查找“总的新项目”非常有用,比如每天访问你的网站的新访客的数量。 常规的基数聚合会告诉你每天有多少独立访问者,但不会区分“新”或“重复”的访问者。 累积基数聚合可用于确定每天有多少独立访问者是“新的”。

语法

一个单独的cumulative_cardinality看起来像这样:

{
    "cumulative_cardinality": {
        "buckets_path": "my_cardinality_agg"
    }
}

表 14. cumulative_cardinality参数

参数名称 描述 是否必需 默认值

buckets_path

我们希望找到其累积基数的基数聚合的路径(更多详情请参考 buckets_path语法)

必须

format

应用于此聚合的输出值的格式

可选

null

下面这个代码片段计算了每日用户(users)总数的累积基数:

GET /user_hits/_search
{
    "size": 0,
    "aggs" : {
        "users_per_day" : {
            "date_histogram" : {
                "field" : "timestamp",
                "calendar_interval" : "day"
            },
            "aggs": {
                "distinct_users": {
                    "cardinality": {
                        "field": "user_id"
                    }
                },
                "total_new_users": {
                    "cumulative_cardinality": {
                        "buckets_path": "distinct_users" 
                    }
                }
            }
        }
    }
}

buckets_path指示该聚合将distinct_users聚合的输出用于累积基数

响应可能像下面这样:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "users_per_day": {
         "buckets": [
            {
               "key_as_string": "2019-01-01T00:00:00.000Z",
               "key": 1546300800000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 2
               }
            },
            {
               "key_as_string": "2019-01-02T00:00:00.000Z",
               "key": 1546387200000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 3
               }
            },
            {
               "key_as_string": "2019-01-03T00:00:00.000Z",
               "key": 1546473600000,
               "doc_count": 3,
               "distinct_users": {
                  "value": 3
               },
               "total_new_users": {
                  "value": 4
               }
            }
         ]
      }
   }
}

请注意第二天,2019-01-02,有两个不同的用户,但由累积管道聚合生成的total_new_users度量仅增加到三个。 这意味着那天的两个用户中只有一个是新的,另一个在前一天已经出现过了。 这种情况在第三天再次发生,三个用户中只有一个是全新的。

增量累积基数(incremental cumulative cardinality)

cumulative_cardinality聚合将向你展示自被查询的时间段开始以来的总的非重复计数。 然而,有时查看“增量”计数是有用的。 也就是说,每天有多少新用户加入,而不是累计的总数。

这可以通过在查询中添加一个derivative聚合来实现:

GET /user_hits/_search
{
    "size": 0,
    "aggs" : {
        "users_per_day" : {
            "date_histogram" : {
                "field" : "timestamp",
                "calendar_interval" : "day"
            },
            "aggs": {
                "distinct_users": {
                    "cardinality": {
                        "field": "user_id"
                    }
                },
                "total_new_users": {
                    "cumulative_cardinality": {
                        "buckets_path": "distinct_users"
                    }
                },
                "incremental_new_users": {
                    "derivative": {
                        "buckets_path": "total_new_users"
                    }
                }
            }
        }
    }
}

响应可能像下面这样:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "users_per_day": {
         "buckets": [
            {
               "key_as_string": "2019-01-01T00:00:00.000Z",
               "key": 1546300800000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 2
               }
            },
            {
               "key_as_string": "2019-01-02T00:00:00.000Z",
               "key": 1546387200000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 3
               },
               "incremental_new_users": {
                  "value": 1.0
               }
            },
            {
               "key_as_string": "2019-01-03T00:00:00.000Z",
               "key": 1546473600000,
               "doc_count": 3,
               "distinct_users": {
                  "value": 3
               },
               "total_new_users": {
                  "value": 4
               },
               "incremental_new_users": {
                  "value": 1.0
               }
            }
         ]
      }
   }
}