累積基数集計
親のヒストグラム(または日付ヒストグラム)集計で累積基数を計算する親パイプライン集計です。指定されたメトリックは基数集計でなければならず、囲むヒストグラムは min_doc_count
を 0
に設定する必要があります(histogram
集計のデフォルト)。
cumulative_cardinality
集計は、ウェブサイトに毎日訪れる新しい訪問者の数のような「合計新アイテム」を見つけるのに役立ちます。通常の基数集計は、毎日何人のユニークな訪問者が来たかを教えてくれますが、「新しい」訪問者と「リピート」訪問者を区別しません。累積基数集計は、各日のユニークな訪問者のうち「新しい」訪問者が何人であるかを判断するために使用できます。
構文
cumulative_cardinality
集計は、単独ではこのように見えます:
Js
{
"cumulative_cardinality": {
"buckets_path": "my_cardinality_agg"
}
}
表 57. cumulative_cardinality
パラメータ
パラメータ名 | 説明 | 必須 | デフォルト値 |
---|---|---|---|
buckets_path |
累積基数を求める基数集計へのパス(詳細については buckets_path 構文 を参照) |
必須 | |
format |
出力値のための DecimalFormat パターン。指定された場合、フォーマットされた値は集計の value_as_string プロパティに返されます |
オプション | null |
次のスニペットは、毎日の users
の累積基数を計算します:
Python
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)
Ruby
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
Js
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"
}
}
}
}
}
}
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
}
}
]
}
}
}
2日目の 2019-01-02
には2人の異なるユーザーがいますが、累積パイプライン集計によって生成された total_new_users
メトリックは3にしか増加しません。これは、その日の2人のユーザーのうち1人だけが新しいことを意味し、もう1人は前の日にすでに見られていたことを意味します。これは3日目にも再び発生し、3人のユーザーのうち1人だけが完全に新しいです。
増分累積基数
cumulative_cardinality
集計は、クエリされている期間の開始以来の合計の異なるカウントを示します。しかし、時には「増分」カウントを見ることが有用です。つまり、毎日追加される新しいユーザーの数を示します。
これは、クエリに derivative
集計を追加することで実現できます:
Python
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)
Ruby
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
Js
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
}
}
]
}
}
}