累積基数集計

親のヒストグラム(または日付ヒストグラム)集計で累積基数を計算する親パイプライン集計です。指定されたメトリックは基数集計でなければならず、囲むヒストグラムは min_doc_count0 に設定する必要があります(histogram 集計のデフォルト)。

cumulative_cardinality 集計は、ウェブサイトに毎日訪れる新しい訪問者の数のような「合計新アイテム」を見つけるのに役立ちます。通常の基数集計は、毎日何人のユニークな訪問者が来たかを教えてくれますが、「新しい」訪問者と「リピート」訪問者を区別しません。累積基数集計は、各日のユニークな訪問者のうち「新しい」訪問者が何人であるかを判断するために使用できます。

構文

cumulative_cardinality 集計は、単独ではこのように見えます:

Js

  1. {
  2. "cumulative_cardinality": {
  3. "buckets_path": "my_cardinality_agg"
  4. }
  5. }


表 57. cumulative_cardinality パラメータ

パラメータ名 説明 必須 デフォルト値
buckets_path 累積基数を求める基数集計へのパス(詳細については buckets_path 構文 を参照) 必須
format 出力値のための DecimalFormat パターン。指定された場合、フォーマットされた値は集計の value_as_string プロパティに返されます オプション null

次のスニペットは、毎日の users の累積基数を計算します:

Python

  1. resp = client.search(
  2. index="user_hits",
  3. size=0,
  4. aggs={
  5. "users_per_day": {
  6. "date_histogram": {
  7. "field": "timestamp",
  8. "calendar_interval": "day"
  9. },
  10. "aggs": {
  11. "distinct_users": {
  12. "cardinality": {
  13. "field": "user_id"
  14. }
  15. },
  16. "total_new_users": {
  17. "cumulative_cardinality": {
  18. "buckets_path": "distinct_users"
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'user_hits',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. users_per_day: {
  7. date_histogram: {
  8. field: 'timestamp',
  9. calendar_interval: 'day'
  10. },
  11. aggregations: {
  12. distinct_users: {
  13. cardinality: {
  14. field: 'user_id'
  15. }
  16. },
  17. total_new_users: {
  18. cumulative_cardinality: {
  19. buckets_path: 'distinct_users'
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "user_hits",
  3. size: 0,
  4. aggs: {
  5. users_per_day: {
  6. date_histogram: {
  7. field: "timestamp",
  8. calendar_interval: "day",
  9. },
  10. aggs: {
  11. distinct_users: {
  12. cardinality: {
  13. field: "user_id",
  14. },
  15. },
  16. total_new_users: {
  17. cumulative_cardinality: {
  18. buckets_path: "distinct_users",
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET /user_hits/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "users_per_day": {
  6. "date_histogram": {
  7. "field": "timestamp",
  8. "calendar_interval": "day"
  9. },
  10. "aggs": {
  11. "distinct_users": {
  12. "cardinality": {
  13. "field": "user_id"
  14. }
  15. },
  16. "total_new_users": {
  17. "cumulative_cardinality": {
  18. "buckets_path": "distinct_users"
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
buckets_path はこの集計に distinct_users 集計の出力を累積基数に使用するよう指示します

次のような応答があるかもしれません:

コンソール-結果

  1. {
  2. "took": 11,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "users_per_day": {
  8. "buckets": [
  9. {
  10. "key_as_string": "2019-01-01T00:00:00.000Z",
  11. "key": 1546300800000,
  12. "doc_count": 2,
  13. "distinct_users": {
  14. "value": 2
  15. },
  16. "total_new_users": {
  17. "value": 2
  18. }
  19. },
  20. {
  21. "key_as_string": "2019-01-02T00:00:00.000Z",
  22. "key": 1546387200000,
  23. "doc_count": 2,
  24. "distinct_users": {
  25. "value": 2
  26. },
  27. "total_new_users": {
  28. "value": 3
  29. }
  30. },
  31. {
  32. "key_as_string": "2019-01-03T00:00:00.000Z",
  33. "key": 1546473600000,
  34. "doc_count": 3,
  35. "distinct_users": {
  36. "value": 3
  37. },
  38. "total_new_users": {
  39. "value": 4
  40. }
  41. }
  42. ]
  43. }
  44. }
  45. }

2日目の 2019-01-02 には2人の異なるユーザーがいますが、累積パイプライン集計によって生成された total_new_users メトリックは3にしか増加しません。これは、その日の2人のユーザーのうち1人だけが新しいことを意味し、もう1人は前の日にすでに見られていたことを意味します。これは3日目にも再び発生し、3人のユーザーのうち1人だけが完全に新しいです。

増分累積基数

cumulative_cardinality 集計は、クエリされている期間の開始以来の合計の異なるカウントを示します。しかし、時には「増分」カウントを見ることが有用です。つまり、毎日追加される新しいユーザーの数を示します。

これは、クエリに derivative 集計を追加することで実現できます:

Python

  1. resp = client.search(
  2. index="user_hits",
  3. size=0,
  4. aggs={
  5. "users_per_day": {
  6. "date_histogram": {
  7. "field": "timestamp",
  8. "calendar_interval": "day"
  9. },
  10. "aggs": {
  11. "distinct_users": {
  12. "cardinality": {
  13. "field": "user_id"
  14. }
  15. },
  16. "total_new_users": {
  17. "cumulative_cardinality": {
  18. "buckets_path": "distinct_users"
  19. }
  20. },
  21. "incremental_new_users": {
  22. "derivative": {
  23. "buckets_path": "total_new_users"
  24. }
  25. }
  26. }
  27. }
  28. },
  29. )
  30. print(resp)

Ruby

  1. response = client.search(
  2. index: 'user_hits',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. users_per_day: {
  7. date_histogram: {
  8. field: 'timestamp',
  9. calendar_interval: 'day'
  10. },
  11. aggregations: {
  12. distinct_users: {
  13. cardinality: {
  14. field: 'user_id'
  15. }
  16. },
  17. total_new_users: {
  18. cumulative_cardinality: {
  19. buckets_path: 'distinct_users'
  20. }
  21. },
  22. incremental_new_users: {
  23. derivative: {
  24. buckets_path: 'total_new_users'
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }
  31. )
  32. puts response

Js

  1. const response = await client.search({
  2. index: "user_hits",
  3. size: 0,
  4. aggs: {
  5. users_per_day: {
  6. date_histogram: {
  7. field: "timestamp",
  8. calendar_interval: "day",
  9. },
  10. aggs: {
  11. distinct_users: {
  12. cardinality: {
  13. field: "user_id",
  14. },
  15. },
  16. total_new_users: {
  17. cumulative_cardinality: {
  18. buckets_path: "distinct_users",
  19. },
  20. },
  21. incremental_new_users: {
  22. derivative: {
  23. buckets_path: "total_new_users",
  24. },
  25. },
  26. },
  27. },
  28. },
  29. });
  30. console.log(response);

コンソール

  1. GET /user_hits/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "users_per_day": {
  6. "date_histogram": {
  7. "field": "timestamp",
  8. "calendar_interval": "day"
  9. },
  10. "aggs": {
  11. "distinct_users": {
  12. "cardinality": {
  13. "field": "user_id"
  14. }
  15. },
  16. "total_new_users": {
  17. "cumulative_cardinality": {
  18. "buckets_path": "distinct_users"
  19. }
  20. },
  21. "incremental_new_users": {
  22. "derivative": {
  23. "buckets_path": "total_new_users"
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }

次のような応答があるかもしれません:

コンソール-結果

  1. {
  2. "took": 11,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "users_per_day": {
  8. "buckets": [
  9. {
  10. "key_as_string": "2019-01-01T00:00:00.000Z",
  11. "key": 1546300800000,
  12. "doc_count": 2,
  13. "distinct_users": {
  14. "value": 2
  15. },
  16. "total_new_users": {
  17. "value": 2
  18. }
  19. },
  20. {
  21. "key_as_string": "2019-01-02T00:00:00.000Z",
  22. "key": 1546387200000,
  23. "doc_count": 2,
  24. "distinct_users": {
  25. "value": 2
  26. },
  27. "total_new_users": {
  28. "value": 3
  29. },
  30. "incremental_new_users": {
  31. "value": 1.0
  32. }
  33. },
  34. {
  35. "key_as_string": "2019-01-03T00:00:00.000Z",
  36. "key": 1546473600000,
  37. "doc_count": 3,
  38. "distinct_users": {
  39. "value": 3
  40. },
  41. "total_new_users": {
  42. "value": 4
  43. },
  44. "incremental_new_users": {
  45. "value": 1.0
  46. }
  47. }
  48. ]
  49. }
  50. }
  51. }