Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Агрегирования ›Агрегирования на основе конвейера

Агрегирование по сортировке корзин

Родительское агрегирование на основе конвейера, которое сортирует корзины родительского агрегирования, имеющего несколько корзин. Можно указать одно или несколько полей сортировки, а также соответствующий порядок сортировки. Каждая корзина может быть отсортирована по её _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
  }
}

Здесь sort_field_1 — путь к корзине для переменной, используемой в качестве основного критерия сортировки, а порядок сортировки — возрастающий.

Таблица 58. Параметры bucket_sort

Имя параметра Описание Обязательно Значение по умолчанию

sort

Список полей для сортировки. Подробнее см. sort.

Необязательно

from

Корзины с позициями перед заданным значением будут усечены.

Необязательно

0

size

Количество корзин для возврата. По умолчанию возвращаются все корзины родительского агрегирования.

Необязательно

gap_policy

Политика, применяемая при обнаружении пробелов в данных (подробнее см. Обработка пробелов в данных).

Необязательно

skip

Следующий фрагмент возвращает корзины, соответствующие 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                                
          }
        }
      }
    }
  }
}

sort установлено для использования значений total_sales в порядке убывания.

size установлено в 3, что означает, что будут возвращены только 3 лучших месяца в total_sales

И вот пример ответа:

{
   "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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API