バケットソート集約
親パイプライン集約で、親のマルチバケット集約のバケットをソートします。ゼロ個以上のソートフィールドを指定し、対応するソート順序を設定できます。各バケットは、その _key
、_count
またはそのサブ集約に基づいてソートされる場合があります。さらに、from
および size
パラメータを設定して、結果バケットを切り捨てることができます。
bucket_sort
集約は、すべての他の非パイプライン集約の後に実行されるため、すべてのパイプライン集約と同様です。これは、ソートが親集約からすでに返されたバケットにのみ適用されることを意味します。たとえば、親集約が terms
で、その size
が 10
に設定されている場合、bucket_sort
は返された10の用語バケットの上でのみソートされます。
構文
bucket_sort
集約は、単独で次のようになります:
Js
{
"bucket_sort": {
"sort": [
{ "sort_field_1": { "order": "asc" } },
{ "sort_field_2": { "order": "desc" } },
"sort_field_3"
],
"from": 1,
"size": 3
}
}
ここで、sort_field_1 は主なソートに使用される変数へのバケットパスであり、その順序は昇順です。 |
表 56. bucket_sort
パラメータ
| パラメータ名 | 説明 | 必須 | デフォルト値 |
| :— | :— | :— | :— |
| sort
| ソートするフィールドのリスト。詳細については sort
を参照してください。 | オプション | |
| from
| 設定値より前の位置にあるバケットは切り捨てられます。 | オプション | 0
|
| size
| 返すバケットの数。親集約のすべてのバケットがデフォルトです。 | オプション | |
| gap_policy
| データにギャップが見つかった場合に適用するポリシー(詳細については データのギャップの処理 を参照) | オプション | skip
|
次のスニペットは、降順で合計売上が最も高い3か月に対応するバケットを返します:
Python
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"sales_bucket_sort": {
"bucket_sort": {
"sort": [
{
"total_sales": {
"order": "desc"
}
}
],
"size": 3
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
total_sales: {
sum: {
field: 'price'
}
},
sales_bucket_sort: {
bucket_sort: {
sort: [
{
total_sales: {
order: 'desc'
}
}
],
size: 3
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
total_sales: {
sum: {
field: "price",
},
},
sales_bucket_sort: {
bucket_sort: {
sort: [
{
total_sales: {
order: "desc",
},
},
],
size: 3,
},
},
},
},
},
});
console.log(response);
コンソール
POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"sales_bucket_sort": {
"bucket_sort": {
"sort": [
{ "total_sales": { "order": "desc" } }
],
"size": 3
}
}
}
}
}
}
sort は total_sales の値を降順で使用するように設定されています |
|
size は 3 に設定されており、total_sales の上位3か月のみが返されます |
コンソール-結果
{
"took": 82,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00",
"key": 1420070400000,
"doc_count": 3,
"total_sales": {
"value": 550.0
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"total_sales": {
"value": 375.0
}
},
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2,
"total_sales": {
"value": 60.0
}
}
]
}
}
}
ソートなしでの切り捨て
この集約を使用して、ソートを行わずに結果バケットを切り捨てることも可能です。そのためには、from
および/または size
パラメータを使用し、sort
を指定しないだけです。
次の例は、結果を単純に切り捨てて、2番目のバケットのみを返します:
Python
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"bucket_truncate": {
"bucket_sort": {
"from": 1,
"size": 1
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
bucket_truncate: {
bucket_sort: {
from: 1,
size: 1
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
bucket_truncate: {
bucket_sort: {
from: 1,
size: 1,
},
},
},
},
},
});
console.log(response);
コンソール
POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"bucket_truncate": {
"bucket_sort": {
"from": 1,
"size": 1
}
}
}
}
}
}
コンソール-結果
{
"took": 11,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2
}
]
}
}
}