バケットセレクター集約

親パイプライン集約で、現在のバケットが親のマルチバケット集約に保持されるかどうかを判断するスクリプトを実行します。指定されたメトリックは数値でなければならず、スクリプトはブール値を返す必要があります。スクリプト言語が expression の場合、数値の戻り値が許可されます。この場合、0.0 は false と評価され、他のすべての値は true と評価されます。

バケットセレクター集約は、すべてのパイプライン集約と同様に、他のすべての兄弟集約の後に実行されます。これは、バケットセレクター集約を使用して応答内の返されたバケットをフィルタリングしても、集約の実行時間を節約しないことを意味します。

構文

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

Js

  1. {
  2. "bucket_selector": {
  3. "buckets_path": {
  4. "my_var1": "the_sum",
  5. "my_var2": "the_value_count"
  6. },
  7. "script": "params.my_var1 > params.my_var2"
  8. }
  9. }
ここで、my_var1 はスクリプトで使用するこのバケットのパスの変数名で、the_sum はその変数に使用するメトリックへのパスです。


表 55. bucket_selector パラメータ


| パラメータ名 | 説明 | 必須 | デフォルト値 |
| :— | :— | :— | :— |
| script | この集約のために実行するスクリプト。スクリプトはインライン、ファイル、またはインデックス化されたものが可能です。(詳細については スクリプティング を参照) | 必須 | |
| buckets_path | 変数に使用するバケットへの関連パスを持つスクリプト変数のマップです。
(詳細については buckets_path 構文 を参照) | 必須 | |
| gap_policy | データにギャップが見つかったときに適用するポリシー(詳細については データのギャップの処理 を参照) | オプション | skip |

次のスニペットは、月の総売上が200を超えるバケットのみを保持します:

Python

  1. resp = client.search(
  2. index="sales",
  3. size=0,
  4. aggs={
  5. "sales_per_month": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "total_sales": {
  12. "sum": {
  13. "field": "price"
  14. }
  15. },
  16. "sales_bucket_filter": {
  17. "bucket_selector": {
  18. "buckets_path": {
  19. "totalSales": "total_sales"
  20. },
  21. "script": "params.totalSales > 200"
  22. }
  23. }
  24. }
  25. }
  26. },
  27. )
  28. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. sales_per_month: {
  7. date_histogram: {
  8. field: 'date',
  9. calendar_interval: 'month'
  10. },
  11. aggregations: {
  12. total_sales: {
  13. sum: {
  14. field: 'price'
  15. }
  16. },
  17. sales_bucket_filter: {
  18. bucket_selector: {
  19. buckets_path: {
  20. "totalSales": 'total_sales'
  21. },
  22. script: 'params.totalSales > 200'
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }
  29. )
  30. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. sales_per_month: {
  6. date_histogram: {
  7. field: "date",
  8. calendar_interval: "month",
  9. },
  10. aggs: {
  11. total_sales: {
  12. sum: {
  13. field: "price",
  14. },
  15. },
  16. sales_bucket_filter: {
  17. bucket_selector: {
  18. buckets_path: {
  19. totalSales: "total_sales",
  20. },
  21. script: "params.totalSales > 200",
  22. },
  23. },
  24. },
  25. },
  26. },
  27. });
  28. console.log(response);

コンソール

  1. POST /sales/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "sales_per_month": {
  6. "date_histogram": {
  7. "field": "date",
  8. "calendar_interval": "month"
  9. },
  10. "aggs": {
  11. "total_sales": {
  12. "sum": {
  13. "field": "price"
  14. }
  15. },
  16. "sales_bucket_filter": {
  17. "bucket_selector": {
  18. "buckets_path": {
  19. "totalSales": "total_sales"
  20. },
  21. "script": "params.totalSales > 200"
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }

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

コンソール-結果

  1. {
  2. "took": 11,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "sales_per_month": {
  8. "buckets": [
  9. {
  10. "key_as_string": "2015/01/01 00:00:00",
  11. "key": 1420070400000,
  12. "doc_count": 3,
  13. "total_sales": {
  14. "value": 550.0
  15. }
  16. },
  17. {
  18. "key_as_string": "2015/03/01 00:00:00",
  19. "key": 1425168000000,
  20. "doc_count": 2,
  21. "total_sales": {
  22. "value": 375.0
  23. }
  24. }
  25. ]
  26. }
  27. }
  28. }
2015/02/01 00:00:00 のバケットは、総売上が200未満だったため削除されました