Агрегирование по сортировке корзин
Родительское агрегирование на основе конвейера, которое сортирует корзины родительского агрегирования, имеющего несколько корзин. Можно указать одно или несколько полей сортировки, а также соответствующий порядок сортировки. Каждая корзина может быть отсортирована по её _key, _count или по её дочерним агрегированиям. Кроме того, можно установить параметры from и size для усечения результативных корзин.
Агрегирование bucket_sort, как и все агрегирования на основе конвейера, выполняется после всех других агрегирований, не являющихся агрегированиями на основе конвейера. Это означает, что сортировка применяется только к тем корзинам, которые уже возвращены родительским агрегированием. Например, если родительским агрегированием является terms и его size установлено в 10, то bucket_sort будет сортировать только по этим 10 возвращенным корзинам терминов.
Синтаксис
Агрегирование bucket_sort выглядит следующим образом:
{
"bucket_sort": {
"sort": [
{ "sort_field_1": { "order": "asc" } },
{ "sort_field_2": { "order": "desc" } },
"sort_field_3"
],
"from": 1,
"size": 3
}
} | Здесь |
Таблица 58. Параметры bucket_sort
| Имя параметра | Описание | Обязательно | Значение по умолчанию |
|---|---|---|---|
| Список полей для сортировки. Подробнее см. | Необязательно | |
| Корзины с позициями перед заданным значением будут усечены. | Необязательно |
|
| Количество корзин для возврата. По умолчанию возвращаются все корзины родительского агрегирования. | Необязательно | |
| Политика, применяемая при обнаружении пробелов в данных (подробнее см. Обработка пробелов в данных). | Необязательно |
|
Следующий фрагмент возвращает корзины, соответствующие 3 месяцам с наибольшим общим объемом продаж в порядке убывания:
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) 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 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
}
}
}
}
}
} |
| |
|
|
И вот пример ответа:
{
"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.
Следующий пример просто усекает результат, чтобы вернуть только вторую корзину:
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) 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 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
}
]
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-aggregations-pipeline-bucket-sort-aggregation.html