レート集約

rate メトリクス集約は、date_histogram または composite 集約の内部でのみ使用できます。これは、各バケット内のドキュメントまたはフィールドのレートを計算します。フィールドの値は、ドキュメント内の特定の数値または ヒストグラムフィールド から抽出できます。

composite 集約の場合、rate 集約がサポートされるためには、date_histogram ソースが正確に1つ必要です。

構文

rate 集約は、単独で次のようになります:

Js

  1. {
  2. "rate": {
  3. "unit": "month",
  4. "field": "requests"
  5. }
  6. }

次のリクエストは、すべての販売記録を月ごとのバケットにグループ化し、各バケット内の販売取引の数を年間販売レートに変換します。

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. aggs={
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "my_rate": {
  12. "rate": {
  13. "unit": "year"
  14. }
  15. }
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. by_date: {
  7. date_histogram: {
  8. field: 'date',
  9. calendar_interval: 'month'
  10. },
  11. aggregations: {
  12. my_rate: {
  13. rate: {
  14. unit: 'year'
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. by_date: {
  6. date_histogram: {
  7. field: "date",
  8. calendar_interval: "month",
  9. },
  10. aggs: {
  11. my_rate: {
  12. rate: {
  13. unit: "year",
  14. },
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. GET sales/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "my_rate": {
  12. "rate": {
  13. "unit": "year"
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
ヒストグラムは月ごとにグループ化されています。
しかし、レートは年間レートに変換されます。

レスポンスは、各バケット内の取引の年間レートを返します。1年は12ヶ月なので、年間レートは月間レートに12を掛けることで自動的に計算されます。

コンソール-結果

  1. {
  2. ...
  3. "aggregations" : {
  4. "by_date" : {
  5. "buckets" : [
  6. {
  7. "key_as_string" : "2015/01/01 00:00:00",
  8. "key" : 1420070400000,
  9. "doc_count" : 3,
  10. "my_rate" : {
  11. "value" : 36.0
  12. }
  13. },
  14. {
  15. "key_as_string" : "2015/02/01 00:00:00",
  16. "key" : 1422748800000,
  17. "doc_count" : 2,
  18. "my_rate" : {
  19. "value" : 24.0
  20. }
  21. },
  22. {
  23. "key_as_string" : "2015/03/01 00:00:00",
  24. "key" : 1425168000000,
  25. "doc_count" : 2,
  26. "my_rate" : {
  27. "value" : 24.0
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }

ドキュメントの数をカウントする代わりに、各バケット内のドキュメントのフィールドのすべての値の合計や、各バケット内の値の数を計算することも可能です。次のリクエストは、すべての販売記録を月ごとのバケットにグループ化し、総月間販売を計算し、それを平均日間販売に変換します。

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. aggs={
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "avg_price": {
  12. "rate": {
  13. "field": "price",
  14. "unit": "day"
  15. }
  16. }
  17. }
  18. }
  19. },
  20. )
  21. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. by_date: {
  7. date_histogram: {
  8. field: 'date',
  9. calendar_interval: 'month'
  10. },
  11. aggregations: {
  12. avg_price: {
  13. rate: {
  14. field: 'price',
  15. unit: 'day'
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. by_date: {
  6. date_histogram: {
  7. field: "date",
  8. calendar_interval: "month",
  9. },
  10. aggs: {
  11. avg_price: {
  12. rate: {
  13. field: "price",
  14. unit: "day",
  15. },
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. GET sales/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "avg_price": {
  12. "rate": {
  13. "field": "price",
  14. "unit": "day"
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
ヒストグラムは月ごとにグループ化されています。
すべての販売価格の合計を計算します
平均日間販売に変換します

レスポンスには、各月の平均日間販売価格が含まれます。

コンソール-結果

  1. {
  2. ...
  3. "aggregations" : {
  4. "by_date" : {
  5. "buckets" : [
  6. {
  7. "key_as_string" : "2015/01/01 00:00:00",
  8. "key" : 1420070400000,
  9. "doc_count" : 3,
  10. "avg_price" : {
  11. "value" : 17.741935483870968
  12. }
  13. },
  14. {
  15. "key_as_string" : "2015/02/01 00:00:00",
  16. "key" : 1422748800000,
  17. "doc_count" : 2,
  18. "avg_price" : {
  19. "value" : 2.142857142857143
  20. }
  21. },
  22. {
  23. "key_as_string" : "2015/03/01 00:00:00",
  24. "key" : 1425168000000,
  25. "doc_count" : 2,
  26. "avg_price" : {
  27. "value" : 12.096774193548388
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }

composite 集約を利用して、在庫内の各アイテムの平均日間販売価格を計算することもできます。

Python

  1. resp = client.search(
  2. index="sales",
  3. filter_path="aggregations",
  4. size="0",
  5. aggs={
  6. "buckets": {
  7. "composite": {
  8. "sources": [
  9. {
  10. "month": {
  11. "date_histogram": {
  12. "field": "date",
  13. "calendar_interval": "month"
  14. }
  15. }
  16. },
  17. {
  18. "type": {
  19. "terms": {
  20. "field": "type"
  21. }
  22. }
  23. }
  24. ]
  25. },
  26. "aggs": {
  27. "avg_price": {
  28. "rate": {
  29. "field": "price",
  30. "unit": "day"
  31. }
  32. }
  33. }
  34. }
  35. },
  36. )
  37. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. filter_path: 'aggregations',
  4. size: 0,
  5. body: {
  6. aggregations: {
  7. buckets: {
  8. composite: {
  9. sources: [
  10. {
  11. month: {
  12. date_histogram: {
  13. field: 'date',
  14. calendar_interval: 'month'
  15. }
  16. }
  17. },
  18. {
  19. type: {
  20. terms: {
  21. field: 'type'
  22. }
  23. }
  24. }
  25. ]
  26. },
  27. aggregations: {
  28. avg_price: {
  29. rate: {
  30. field: 'price',
  31. unit: 'day'
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. )
  39. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. filter_path: "aggregations",
  4. size: 0,
  5. aggs: {
  6. buckets: {
  7. composite: {
  8. sources: [
  9. {
  10. month: {
  11. date_histogram: {
  12. field: "date",
  13. calendar_interval: "month",
  14. },
  15. },
  16. },
  17. {
  18. type: {
  19. terms: {
  20. field: "type",
  21. },
  22. },
  23. },
  24. ],
  25. },
  26. aggs: {
  27. avg_price: {
  28. rate: {
  29. field: "price",
  30. unit: "day",
  31. },
  32. },
  33. },
  34. },
  35. },
  36. });
  37. console.log(response);

コンソール

  1. GET sales/_search?filter_path=aggregations&size=0
  2. {
  3. "aggs": {
  4. "buckets": {
  5. "composite": {
  6. "sources": [
  7. {
  8. "month": {
  9. "date_histogram": {
  10. "field": "date",
  11. "calendar_interval": "month"
  12. }
  13. }
  14. },
  15. {
  16. "type": {
  17. "terms": {
  18. "field": "type"
  19. }
  20. }
  21. }
  22. ]
  23. },
  24. "aggs": {
  25. "avg_price": {
  26. "rate": {
  27. "field": "price",
  28. "unit": "day"
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }
日付ヒストグラムソースを持つ複合集約
アイテムタイプのソース。
日付ヒストグラムソースは月ごとにグループ化されます
各販売アイテムタイプのための用語ソースのグループ化
すべての販売価格の合計を計算し、月ごとおよびアイテムごとに
アイテムごとの平均日間販売に変換します

レスポンスには、各月のアイテムごとの平均日間販売価格が含まれます。

コンソール-結果

  1. {
  2. "aggregations" : {
  3. "buckets" : {
  4. "after_key" : {
  5. "month" : 1425168000000,
  6. "type" : "t-shirt"
  7. },
  8. "buckets" : [
  9. {
  10. "key" : {
  11. "month" : 1420070400000,
  12. "type" : "bag"
  13. },
  14. "doc_count" : 1,
  15. "avg_price" : {
  16. "value" : 4.838709677419355
  17. }
  18. },
  19. {
  20. "key" : {
  21. "month" : 1420070400000,
  22. "type" : "hat"
  23. },
  24. "doc_count" : 1,
  25. "avg_price" : {
  26. "value" : 6.451612903225806
  27. }
  28. },
  29. {
  30. "key" : {
  31. "month" : 1420070400000,
  32. "type" : "t-shirt"
  33. },
  34. "doc_count" : 1,
  35. "avg_price" : {
  36. "value" : 6.451612903225806
  37. }
  38. },
  39. {
  40. "key" : {
  41. "month" : 1422748800000,
  42. "type" : "hat"
  43. },
  44. "doc_count" : 1,
  45. "avg_price" : {
  46. "value" : 1.7857142857142858
  47. }
  48. },
  49. {
  50. "key" : {
  51. "month" : 1422748800000,
  52. "type" : "t-shirt"
  53. },
  54. "doc_count" : 1,
  55. "avg_price" : {
  56. "value" : 0.35714285714285715
  57. }
  58. },
  59. {
  60. "key" : {
  61. "month" : 1425168000000,
  62. "type" : "hat"
  63. },
  64. "doc_count" : 1,
  65. "avg_price" : {
  66. "value" : 6.451612903225806
  67. }
  68. },
  69. {
  70. "key" : {
  71. "month" : 1425168000000,
  72. "type" : "t-shirt"
  73. },
  74. "doc_count" : 1,
  75. "avg_price" : {
  76. "value" : 5.645161290322581
  77. }
  78. }
  79. ]
  80. }
  81. }
  82. }

mode パラメータに値 value_count を追加することで、計算を sum からフィールドの値の数に変更できます:

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. aggs={
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "avg_number_of_sales_per_year": {
  12. "rate": {
  13. "field": "price",
  14. "unit": "year",
  15. "mode": "value_count"
  16. }
  17. }
  18. }
  19. }
  20. },
  21. )
  22. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. by_date: {
  7. date_histogram: {
  8. field: 'date',
  9. calendar_interval: 'month'
  10. },
  11. aggregations: {
  12. avg_number_of_sales_per_year: {
  13. rate: {
  14. field: 'price',
  15. unit: 'year',
  16. mode: 'value_count'
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. by_date: {
  6. date_histogram: {
  7. field: "date",
  8. calendar_interval: "month",
  9. },
  10. aggs: {
  11. avg_number_of_sales_per_year: {
  12. rate: {
  13. field: "price",
  14. unit: "year",
  15. mode: "value_count",
  16. },
  17. },
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. GET sales/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "by_date": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "avg_number_of_sales_per_year": {
  12. "rate": {
  13. "field": "price",
  14. "unit": "year",
  15. "mode": "value_count"
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
ヒストグラムは月ごとにグループ化されています。
すべての販売価格の数を計算します
年間カウントに変換します
モードを値カウントに変更します

レスポンスには、各月の平均日間販売価格が含まれます。

コンソール-結果

  1. {
  2. ...
  3. "aggregations" : {
  4. "by_date" : {
  5. "buckets" : [
  6. {
  7. "key_as_string" : "2015/01/01 00:00:00",
  8. "key" : 1420070400000,
  9. "doc_count" : 3,
  10. "avg_number_of_sales_per_year" : {
  11. "value" : 36.0
  12. }
  13. },
  14. {
  15. "key_as_string" : "2015/02/01 00:00:00",
  16. "key" : 1422748800000,
  17. "doc_count" : 2,
  18. "avg_number_of_sales_per_year" : {
  19. "value" : 24.0
  20. }
  21. },
  22. {
  23. "key_as_string" : "2015/03/01 00:00:00",
  24. "key" : 1425168000000,
  25. "doc_count" : 2,
  26. "avg_number_of_sales_per_year" : {
  27. "value" : 24.0
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }

デフォルトでは sum モードが使用されます。

  • "mode": "sum"
  • すべての値フィールドの合計を計算します
  • "mode": "value_count"
  • フィールド内の値の数を使用します

バケットサイズとレートの関係

rate 集約は、date_histogram 集約の calendar_intervals パラメータ で使用できるすべてのレートをサポートします。指定されたレートは、date_histogram 集約の間隔と互換性がある必要があります。つまり、バケットサイズをレートに変換できる必要があります。デフォルトでは date_histogram の間隔が使用されます。

  • "rate": "second"
  • すべての間隔と互換性があります
  • "rate": "minute"
  • すべての間隔と互換性があります
  • "rate": "hour"
  • すべての間隔と互換性があります
  • "rate": "day"
  • すべての間隔と互換性があります
  • "rate": "week"
  • すべての間隔と互換性があります
  • "rate": "month"
  • monthquarteryear カレンダー間隔とのみ互換性があります
  • "rate": "quarter"
  • monthquarteryear カレンダー間隔とのみ互換性があります
  • "rate": "year"
  • monthquarteryear カレンダー間隔とのみ互換性があります

日付ヒストグラムがレートヒストグラムの直接の親でない場合、追加の制限があります。この場合、レート間隔とヒストグラム間隔は同じグループに属する必要があります: [second, minute, hour, day, week] または [month, quarter, year]。たとえば、日付ヒストグラムが month ベースの場合、monthquarter、または year のレート間隔のみがサポートされます。日付ヒストグラムが day ベースの場合、secondminutehourdayweek のレート間隔のみがサポートされます。

スクリプト

インデックスされていない値に対して集約を実行する必要がある場合は、ランタイムフィールド で集約を実行します。たとえば、レートを計算する前に価格を調整する必要がある場合:

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. runtime_mappings={
  5. "price.adjusted": {
  6. "type": "double",
  7. "script": {
  8. "source": "emit(doc['price'].value * params.adjustment)",
  9. "params": {
  10. "adjustment": 0.9
  11. }
  12. }
  13. }
  14. },
  15. aggs={
  16. "by_date": {
  17. "date_histogram": {
  18. "field": "date",
  19. "calendar_interval": "month"
  20. },
  21. "aggs": {
  22. "avg_price": {
  23. "rate": {
  24. "field": "price.adjusted"
  25. }
  26. }
  27. }
  28. }
  29. },
  30. )
  31. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. runtime_mappings: {
  6. 'price.adjusted' => {
  7. type: 'double',
  8. script: {
  9. source: "emit(doc['price'].value * params.adjustment)",
  10. params: {
  11. adjustment: 0.9
  12. }
  13. }
  14. }
  15. },
  16. aggregations: {
  17. by_date: {
  18. date_histogram: {
  19. field: 'date',
  20. calendar_interval: 'month'
  21. },
  22. aggregations: {
  23. avg_price: {
  24. rate: {
  25. field: 'price.adjusted'
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. runtime_mappings: {
  5. "price.adjusted": {
  6. type: "double",
  7. script: {
  8. source: "emit(doc['price'].value * params.adjustment)",
  9. params: {
  10. adjustment: 0.9,
  11. },
  12. },
  13. },
  14. },
  15. aggs: {
  16. by_date: {
  17. date_histogram: {
  18. field: "date",
  19. calendar_interval: "month",
  20. },
  21. aggs: {
  22. avg_price: {
  23. rate: {
  24. field: "price.adjusted",
  25. },
  26. },
  27. },
  28. },
  29. },
  30. });
  31. console.log(response);

コンソール

  1. GET sales/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "price.adjusted": {
  6. "type": "double",
  7. "script": {
  8. "source": "emit(doc['price'].value * params.adjustment)",
  9. "params": {
  10. "adjustment": 0.9
  11. }
  12. }
  13. }
  14. },
  15. "aggs": {
  16. "by_date": {
  17. "date_histogram": {
  18. "field": "date",
  19. "calendar_interval": "month"
  20. },
  21. "aggs": {
  22. "avg_price": {
  23. "rate": {
  24. "field": "price.adjusted"
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }

コンソール-結果

  1. {
  2. ...
  3. "aggregations" : {
  4. "by_date" : {
  5. "buckets" : [
  6. {
  7. "key_as_string" : "2015/01/01 00:00:00",
  8. "key" : 1420070400000,
  9. "doc_count" : 3,
  10. "avg_price" : {
  11. "value" : 495.0
  12. }
  13. },
  14. {
  15. "key_as_string" : "2015/02/01 00:00:00",
  16. "key" : 1422748800000,
  17. "doc_count" : 2,
  18. "avg_price" : {
  19. "value" : 54.0
  20. }
  21. },
  22. {
  23. "key_as_string" : "2015/03/01 00:00:00",
  24. "key" : 1425168000000,
  25. "doc_count" : 2,
  26. "avg_price" : {
  27. "value" : 337.5
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }