【Elasticsearch】cumulative_cardinality

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。

通过这种方式,您可以清晰地了解每天新增的唯一用户数量,而不仅仅是累计总数。

相关推荐
Elastic 中国社区官方博客7 分钟前
EDB EPAS 通过 PostgreSQL 连接器同步数据到 Elasticsearch
大数据·数据库·人工智能·elasticsearch·搜索引擎·postgresql·全文检索
武子康2 小时前
大数据-174 Elasticsearch 查询 DSL 实战:match/match_phrase/query_string/multi_match 全解析
大数据·后端·elasticsearch
jiayong233 小时前
Elasticsearch 核心概念详解:Index、Document、Field
大数据·elasticsearch·jenkins
j***51894 小时前
使用Canal将MySQL数据同步到ES(Linux)
linux·mysql·elasticsearch
知秋正在9964 小时前
ElasticSearch索引red,关键字 Too many open files
大数据·elasticsearch·搜索引擎
liliangcsdn5 小时前
elasticsearch增删改查索引结构示例
大数据·elasticsearch·搜索引擎
serendipity_hky16 小时前
互联网大厂Java面试故事:核心技术栈与场景化业务问题实战解析
java·spring boot·redis·elasticsearch·微服务·消息队列·内容社区
Elastic 中国社区官方博客17 小时前
ES|QL 在 9.2:智能查找连接和时间序列支持
大数据·数据库·人工智能·sql·elasticsearch·搜索引擎·全文检索
知秋正在99618 小时前
ElasticSearch服务端报错:FileSystemException: No space left on device
大数据·elasticsearch·搜索引擎
一个大专生的淘汰之路20 小时前
Elasticsearch 如何确保新增文档立即可见?
elasticsearch