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.
Глобальное отображение ординалов использует оперативную память в качестве части кэша данных поля. Агрегации по полям с высокой кардинальностью могут использовать много памяти и вызвать разрыв цепи данных поля.
Загрузка глобальных ординалов
Глобальное отображение ординалов должно быть построено, прежде чем ординалы смогут использоваться в поиске. По умолчанию отображение загружается во время поиска в первый раз, когда требуются глобальные ординалы. Это правильный подход, если вы оптимизируете скорость индексирования, но если производительность поиска имеет приоритет, рекомендуется загружать глобальные ординалы для полей, которые будут использоваться в агрегациях:
PUT my-index-000001/_mapping
{
"properties": {
"tags": {
"type": "keyword",
"eager_global_ordinals": true
}
}
} Когда eager_global_ordinals включено, глобальные ординалы строятся, когда фрагмент обновляется — Elasticsearch всегда загружает их перед предоставлением изменений в содержимое индекса. Это переносит стоимость построения глобальных ординалов с поиска на время индексирования. Elasticsearch также будет строить глобальные ординалы при создании новой копии фрагмента, как может произойти при увеличении количества реплик или перемещении фрагмента на новый узел.
Загрузка по требованию может быть отключена в любое время путём обновления настройки eager_global_ordinals:
PUT my-index-000001/_mapping
{
"properties": {
"tags": {
"type": "keyword",
"eager_global_ordinals": false
}
}
} В замороженном индексе глобальные ординалы удаляются после каждого поиска и перестроятся снова, когда они будут запрошены. Это означает, что eager_global_ordinals не следует использовать в замороженных индексах: это приведет к перезагрузке глобальных ординалов при каждом поиске. Вместо этого индекс следует форсированно объединить в один сегмент перед заморозкой. Это позволит избежать построения глобальных ординалов (подробнее см. в следующем разделе).
Избегание загрузки глобальных ординалов
Обычно, глобальные ординалы не представляют большой нагрузки в плане времени загрузки и использования памяти. Однако, загрузка глобальных ординалов может быть дорогостоящей для индексов с большими фрагментами или если поля содержат большое количество уникальных значений терминов. Поскольку глобальные ординалы предоставляют унифицированное отображение для всех сегментов фрагмента, они также должны быть полностью перестроены, когда новый сегмент становится видимым.
В некоторых случаях можно полностью избежать загрузки глобальных ординалов:
- Агрегации
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/7.17/eager-global-ordinals.html