Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.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 является путем к корзине для переменной, используемой в качестве первичного ключа сортировки, а порядок сортировки — возрастающий.

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

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

sort

Список полей для сортировки. Более подробную информацию см. в разделе sort.

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

from

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

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

0

size

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

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

gap_policy

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

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

skip

Следующий фрагмент возвращает корзины, соответствующие 3 месяцам с наибольшим объемом продаж в порядке убывания:

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.

Следующий пример просто усекает результат, чтобы вернуть только вторую корзину:

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/7.17/search-aggregations-pipeline-bucket-sort-aggregation.html

Spec-Zone.ru

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