1.定义与用途
`cumulative_cardinality`是一种父级管道聚合(Parent Pipeline Aggregation),用于在父级直方图(`histogram`)或日期直方图(`date_histogram`)聚合中计算累计基数。它主要用于统计在某个时间范围内“新增”的唯一项目数量,例如每天访问网站的新访客数量。
2.工作原理
`cumulative_cardinality`聚合会计算每个时间桶中的唯一值数量,并将这些值累计起来。它依赖于父级直方图中的某个基数聚合(`cardinality`)结果。具体来说,它会从第一个时间桶开始,逐个累加每个桶中的唯一值数量,从而得到每个时间点的累计唯一值数量。
3.参数
• `buckets_path`:必需参数,指定要计算累计基数的基数聚合路径。
• `format`:可选参数,定义输出值的格式。如果指定,格式化的值将返回在聚合的`value_as_string`属性中。
4.应用场景
`cumulative_cardinality`聚合特别适用于以下场景:
• 统计新增用户:例如,每天访问网站的新访客数量。
• 分析趋势:通过累计唯一值的变化,可以分析数据的增长趋势。
5.示例
假设我们有一个索引`user_hits`,其中记录了每次用户访问的日期(`timestamp`字段)和用户ID(`user_id`字段)。我们希望计算每天新增的唯一用户数量。
查询示例:
```json
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"
}
}
}
}
}
}
```
响应结果:
```json
{
"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-01:当天有2个唯一用户,且都是新增用户。
• 2019-01-02:当天有2个唯一用户,但累计新增用户数为3,说明当天只有1个是新增用户。
• 2019-01-03:当天有3个唯一用户,累计新增用户数为4,说明当天只有1个是新增用户。
6.增量累计基数
有时,我们不仅需要累计总数,还需要查看每天新增的用户数(而不是累计总数)。这可以通过在查询中添加一个`derivative`聚合来实现。
查询示例:
```json
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"
}
}
}
}
}
}
```
响应结果:
```json
{
"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
}
}
]
}
}
}
```
结果解释:
• 2019-01-01:新增用户数为2。
• 2019-01-02:新增用户数为1。
• 2019-01-03:新增用户数为1。
通过这种方式,您可以清晰地了解每天新增的唯一用户数量,而不仅仅是累计总数。