Агрегирование кумулятивной кратности
Родительское агрегирование по этапам, которое вычисляет кумулятивную кратность в родительском агрегировании гистограммы (или агрегировании по дате). Указанный метрический показатель должен быть агрегированием кратности, а окружающая гистограмма должна иметь min_doc_count, установленное на 0 (значение по умолчанию для агрегирований histogram).
Агрегирование cumulative_cardinality полезно для определения «общего количества новых элементов», таких как количество новых посетителей вашего веб-сайта каждый день. Регулярное агрегирование кратности покажет вам, сколько уникальных посетителей пришло каждый день, но не различает «новых» и «повторных» посетителей. Агрегирование кумулятивной кратности можно использовать для определения того, сколько уникальных посетителей каждого дня являются «новыми».
Синтаксис
Агрегирование cumulative_cardinality в изоляции выглядит следующим образом:
{
"cumulative_cardinality": {
"buckets_path": "my_cardinality_agg"
}
} Таблица 59. Параметры cumulative_cardinality
| Имя параметра | Описание | Требуется | Значение по умолчанию |
|---|---|---|---|
| Путь к агрегированию кратности, для которого мы хотим найти кумулятивную кратность (см. | Требуется | |
| Шаблон DecimalFormat для выходного значения. Если указан, отформатированное значение возвращается в свойстве | Необязательно |
|
Следующий фрагмент кода вычисляет кумулятивную кратность общего количества users за день:
resp = client.search(
index="user_hits",
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"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'user_hits',
body: {
size: 0,
aggregations: {
users_per_day: {
date_histogram: {
field: 'timestamp',
calendar_interval: 'day'
},
aggregations: {
distinct_users: {
cardinality: {
field: 'user_id'
}
},
total_new_users: {
cumulative_cardinality: {
buckets_path: 'distinct_users'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "user_hits",
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",
},
},
},
},
},
});
console.log(response); 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"
}
}
}
}
}
} |
|
И следующий результат может быть следующим:
{
"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, сгенерированная кумулятивным агрегированием по этапам, увеличивается только до трех. Это означает, что только один из двух пользователей в этот день был новым, а другой уже был виден в предыдущий день. Это происходит снова на третий день, когда только один из трех пользователей является совершенно новым.
Инкрементная кумулятивная кратность
Агрегирование cumulative_cardinality покажет вам общее количество уникальных элементов с начала запрошенного периода. Однако иногда полезно увидеть «инкрементное» количество. То есть сколько новых пользователей добавляется каждый день, а не общее кумулятивное количество.
Этого можно достичь, добавив агрегирование derivative в наш запрос:
resp = client.search(
index="user_hits",
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"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'user_hits',
body: {
size: 0,
aggregations: {
users_per_day: {
date_histogram: {
field: 'timestamp',
calendar_interval: 'day'
},
aggregations: {
distinct_users: {
cardinality: {
field: 'user_id'
}
},
total_new_users: {
cumulative_cardinality: {
buckets_path: 'distinct_users'
}
},
incremental_new_users: {
derivative: {
buckets_path: 'total_new_users'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "user_hits",
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",
},
},
},
},
},
});
console.log(response); 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
}
}
]
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-aggregations-pipeline-cumulative-cardinality-aggregation.html