Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Отображение ›Параметры отображения

eager_global_ordinals

Что такое глобальные ординалы?

Для поддержки агрегаций и других операций, требующих поиска значений полей в каждом документе, Elasticsearch использует структуру данных, называемую doc values. Типы полей, основанные на терминах, такие как keyword, хранят свои значения doc values с использованием отображения ординалов для более компактного представления. Это отображение работает путем присвоения каждому термину целочисленного значения, увеличивающегося по лексикографическому порядку, или ординала. Значения doc values поля хранят только ординалы для каждого документа вместо исходных терминов, с отдельной структурой поиска для преобразования между ординалами и терминами.

При использовании в агрегациях ординалы могут значительно улучшить производительность. Например, агрегация terms полагается только на ординалы для сбора документов в корзины на уровне фрагмента, а затем преобразует ординалы обратно в исходные значения терминов при объединении результатов по фрагментам.

Каждый фрагмент индекса определяет своё отображение ординалов, но агрегации собирают данные по всему фрагменту. Таким образом, чтобы использовать ординалы для операций на уровне фрагмента, таких как агрегации, Elasticsearch создаёт единое отображение, называемое глобальными ординалами. Глобальное отображение ординалов основано на ординалах сегмента и работает, поддерживая отображение от глобального ординала до локального ординала для каждого сегмента.

Глобальные ординалы используются, если запрос содержит следующие компоненты:

  • Некоторые агрегации по корзинам для полей keyword, ip и flattened. Это включает в себя агрегации terms, упомянутые выше, а также composite, diversified_sampler и significant_terms.
  • Агрегации по корзинам для полей text, которые требуют, чтобы fielddata был включён.
  • Операции с родительскими и дочерними документами из поля join, включая запросы has_child и агрегации parent.

Глобальное отображение ординалов использует оперативную память в рамках кеша данных полей. Агрегации на полях с высокой кардинальностью могут использовать много памяти и вызвать разрыв цепи данных полей.

Загрузка глобальных ординалов

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

resp = client.indices.put_mapping(
    index="my-index-000001",
    properties={
        "tags": {
            "type": "keyword",
            "eager_global_ordinals": True
        }
    },
)
print(resp)
response = client.indices.put_mapping(
  index: 'my-index-000001',
  body: {
    properties: {
      tags: {
        type: 'keyword',
        eager_global_ordinals: true
      }
    }
  }
)
puts response
const response = await client.indices.putMapping({
  index: "my-index-000001",
  properties: {
    tags: {
      type: "keyword",
      eager_global_ordinals: true,
    },
  },
});
console.log(response);
PUT my-index-000001/_mapping
{
  "properties": {
    "tags": {
      "type": "keyword",
      "eager_global_ordinals": true
    }
  }
}

Когда eager_global_ordinals включен, глобальные ординалы строятся, когда фрагмент обновляется — Elasticsearch всегда загружает их, прежде чем обнародовать изменения в содержимом индекса. Это переносит затраты на построение глобальных ординалов с поиска на время индексирования. Elasticsearch также будет заранее строить глобальные ординалы при создании новой копии фрагмента, как это может произойти при увеличении числа реплик или перемещении фрагмента на новый узел.

Загрузку можно отключить в любое время, обновив параметр eager_global_ordinals:

resp = client.indices.put_mapping(
    index="my-index-000001",
    properties={
        "tags": {
            "type": "keyword",
            "eager_global_ordinals": False
        }
    },
)
print(resp)
response = client.indices.put_mapping(
  index: 'my-index-000001',
  body: {
    properties: {
      tags: {
        type: 'keyword',
        eager_global_ordinals: false
      }
    }
  }
)
puts response
const response = await client.indices.putMapping({
  index: "my-index-000001",
  properties: {
    tags: {
      type: "keyword",
      eager_global_ordinals: false,
    },
  },
});
console.log(response);
PUT my-index-000001/_mapping
{
  "properties": {
    "tags": {
      "type": "keyword",
      "eager_global_ordinals": false
    }
  }
}

Избегание загрузки глобальных ординалов

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

В некоторых случаях можно вообще избежать загрузки глобальных ординалов:

  • Агрегации terms, sampler и significant_terms поддерживают параметр execution_hint, который помогает контролировать сбор корзин. Он имеет значение по умолчанию global_ordinals, но может быть установлен на map, чтобы вместо этого использовать значения терминов напрямую.
  • Если фрагмент был принудительно объединён до одного сегмента, то его ординалы сегмента уже являются глобальными для фрагмента. В этом случае Elasticsearch не нужно создавать глобальное отображение ординалов, и нет дополнительной нагрузки от использования глобальных ординалов. Обратите внимание, что по причинам производительности вы должны объединить индекс только в том случае, если вы больше не будете в него записывать.

© 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/eager-global-ordinals.html

Spec-Zone.ru

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