Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Агрегирования ›Агрегирования по группам

Агрегирование Multi Terms

Агрегирование, основанное на источнике значений для нескольких групп, где группы динамически создаются — по одному на каждое уникальное значение. Агрегирование multi terms очень похоже на агрегирование terms aggregation, однако в большинстве случаев оно будет медленнее, чем агрегирование terms, и потребует больше памяти. Поэтому, если постоянно используется один и тот же набор полей, эффективнее создать комбинированный ключ для этих полей как отдельное поле и использовать агрегирование terms для этого поля.

Агрегирование multi_term наиболее полезно, когда требуется сортировка по количеству документов или метрическому агрегированию по составному ключу и получение N лучших результатов. Если сортировка не требуется, а все значения ожидаются с использованием агрегирования nested terms или composite aggregations, то это будет более быстрым и экономичным с точки зрения памяти решением.

Пример:

GET /products/_search
{
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [{
          "field": "genre" 
        }, {
          "field": "product"
        }]
      }
    }
  }
}

Агрегирование может работать с теми же типами полей, что и terms aggregation, и поддерживает большинство параметров агрегирования terms.

Ответ:

{
  ...
  "aggregations" : {
    "genres_and_products" : {
      "doc_count_error_upper_bound" : 0,  
      "sum_other_doc_count" : 0,          
      "buckets" : [                       
        {
          "key" : [                       
            "rock",
            "Product A"
          ],
          "key_as_string" : "rock|Product A",
          "doc_count" : 2
        },
        {
          "key" : [
            "electronic",
            "Product B"
          ],
          "key_as_string" : "electronic|Product B",
          "doc_count" : 1
        },
        {
          "key" : [
            "jazz",
            "Product B"
          ],
          "key_as_string" : "jazz|Product B",
          "doc_count" : 1
        },
        {
          "key" : [
            "rock",
            "Product B"
          ],
          "key_as_string" : "rock|Product B",
          "doc_count" : 1
        }
      ]
    }
  }
}

верхняя граница ошибки подсчета документов для каждого термина, см. <<search-aggregations-bucket-multi-terms-aggregation-approximate-counts,ниже>

если имеется много уникальных терминов, Elasticsearch возвращает только лучшие термины; это число равно сумме подсчетов документов для всех групп, которые не являются частью ответа

список лучших групп.

ключами являются массивы значений, отсортированные так же, как и выражение в параметре terms агрегирования

По умолчанию, агрегирование multi_terms вернёт группы для десяти лучших терминов, отсортированных по doc_count. Это поведение можно изменить, задав параметр size.

Параметры агрегирования

Поддерживаются следующие параметры. Для более подробного объяснения этих параметров см. terms aggregation.

size

Необязательно. Определяет, сколько групп терминов должно быть возвращено из общего списка терминов. По умолчанию равно 10.

shard_size

Необязательно. Чем выше значение запрашиваемого size, тем точнее будут результаты, но и тем дороже будет вычисление окончательных результатов. Значение по умолчанию shard_size равно (size * 1.5 + 10).

show_term_doc_count_error

Необязательно. Вычисляет ошибку подсчета документов для каждого термина. По умолчанию равно false

order

Необязательно. Указывает порядок групп. По умолчанию — количество документов на группу. Значение ключа группы используется в качестве дополнительного критерия для групп с одинаковым количеством документов.

min_doc_count

Необязательно. Минимальное количество документов в группе для её возвращения. По умолчанию равно 1.

shard_min_doc_count

Необязательно. Минимальное количество документов в группе на каждом фрагменте для её возвращения. По умолчанию равно min_doc_count.

collect_mode

Необязательно. Указывает стратегию сбора данных. Поддерживаются режимы depth_first и breadth_first. По умолчанию breadth_first.

Скрипт

Генерация терминов с помощью скрипта:

GET /products/_search
{
  "runtime_mappings": {
    "genre.length": {
      "type": "long",
      "script": "emit(doc['genre'].value.length())"
    }
  },
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "genre.length"
          },
          {
            "field": "product"
          }
        ]
      }
    }
  }
}

Ответ:

{
  ...
  "aggregations" : {
    "genres_and_products" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : [
            4,
            "Product A"
          ],
          "key_as_string" : "4|Product A",
          "doc_count" : 2
        },
        {
          "key" : [
            4,
            "Product B"
          ],
          "key_as_string" : "4|Product B",
          "doc_count" : 2
        },
        {
          "key" : [
            10,
            "Product B"
          ],
          "key_as_string" : "10|Product B",
          "doc_count" : 1
        }
      ]
    }
  }
}

Пропущенное значение

Параметр missing определяет, как должны обрабатываться документы, у которых отсутствует значение. По умолчанию, если отсутствует любой из компонентов ключа, весь документ игнорируется, но также можно обработать их как имеющие значение с помощью параметра missing.

GET /products/_search
{
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "genre"
          },
          {
            "field": "product",
            "missing": "Product Z"
          }
        ]
      }
    }
  }
}

Ответ:

{
   ...
   "aggregations" : {
    "genres_and_products" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : [
            "rock",
            "Product A"
          ],
          "key_as_string" : "rock|Product A",
          "doc_count" : 2
        },
        {
          "key" : [
            "electronic",
            "Product B"
          ],
          "key_as_string" : "electronic|Product B",
          "doc_count" : 1
        },
        {
          "key" : [
            "electronic",
            "Product Z"
          ],
          "key_as_string" : "electronic|Product Z",  
          "doc_count" : 1
        },
        {
          "key" : [
            "jazz",
            "Product B"
          ],
          "key_as_string" : "jazz|Product B",
          "doc_count" : 1
        },
        {
          "key" : [
            "rock",
            "Product B"
          ],
          "key_as_string" : "rock|Product B",
          "doc_count" : 1
        }
      ]
    }
  }
}

Документы без значения в поле product попадут в ту же группу, что и документы со значением Product Z.

Смешение типов полей

При агрегировании по нескольким индексам тип агрегируемого поля может не совпадать во всех индексах. Некоторые типы совместимы друг с другом (integer и long или float и double), но при смешении типов десятичных и не десятичных чисел агрегирование terms будет преобразовывать не десятичные числа в десятичные. Это может привести к потере точности значений в группах.

Под агрегирования и примеры сортировки

Как и большинство агрегаций по группам, multi_term поддерживает под агрегирования и сортировку групп по метрическим под агрегированиям:

GET /products/_search
{
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "genre"
          },
          {
            "field": "product"
          }
        ],
        "order": {
          "total_quantity": "desc"
        }
      },
      "aggs": {
        "total_quantity": {
          "sum": {
            "field": "quantity"
          }
        }
      }
    }
  }
}
{
  ...
  "aggregations" : {
    "genres_and_products" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : [
            "jazz",
            "Product B"
          ],
          "key_as_string" : "jazz|Product B",
          "doc_count" : 1,
          "total_quantity" : {
            "value" : 10.0
          }
        },
        {
          "key" : [
            "rock",
            "Product A"
          ],
          "key_as_string" : "rock|Product A",
          "doc_count" : 2,
          "total_quantity" : {
            "value" : 9.0
          }
        },
        {
          "key" : [
            "electronic",
            "Product B"
          ],
          "key_as_string" : "electronic|Product B",
          "doc_count" : 1,
          "total_quantity" : {
            "value" : 3.0
          }
        },
        {
          "key" : [
            "rock",
            "Product B"
          ],
          "key_as_string" : "rock|Product B",
          "doc_count" : 1,
          "total_quantity" : {
            "value" : 1.0
          }
        }
      ]
    }
  }
}

© 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-bucket-multi-terms-aggregation.html

Spec-Zone.ru

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