Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Картирование ›Поля метаданных

_routing поле

Документ маршрутизируется на определённый фрагмент в индексе, используя следующие формулы:

routing_factor = num_routing_shards / num_primary_shards
shard_num = (hash(_routing) % num_routing_shards) / routing_factor

num_routing_shards — значение параметра index.number_of_routing_shards индекса. num_primary_shards — значение параметра index.number_of_shards индекса.

Значение по умолчанию для _routing — _id документа. Пользовательские схемы маршрутизации можно реализовать, указав пользовательское значение routing для каждого документа. Например:

PUT my-index-000001/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}

GET my-index-000001/_doc/1?routing=user1 

В этом документе используется user1 в качестве значения маршрутизации вместо идентификатора.

То же самое значение routing необходимо предоставить при получении, удалении или обновлении документа.

Значение поля _routing доступно в запросах:

GET my-index-000001/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

Запрос к полю _routing (см. также ids запрос)

Потоки данных не поддерживают пользовательскую маршрутизацию. Вместо этого обратитесь к соответствующему индексу для потока.

Поиск с пользовательской маршрутизацией

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

GET my-index-000001/_search?routing=user1,user2 
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}

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

Обязательность значения маршрутизации

При использовании пользовательской маршрутизации важно предоставить значение маршрутизации при индексировании, получении, удалении или обновлении документа.

Пропуск значения маршрутизации может привести к индексированию документа более чем в одном фрагменте. В целях безопасности, поле _routing может быть настроено так, чтобы требовать пользовательское значение routing для всех операций CRUD:

PUT my-index-000002
{
  "mappings": {
    "_routing": {
      "required": true 
    }
  }
}

PUT my-index-000002/_doc/1 
{
  "text": "No routing value provided"
}

Маршрутизация требуется для всех документов.

Этот запрос индекса вызовет routing_missing_exception.

Уникальные ID с пользовательской маршрутизацией

При индексировании документов с указанием пользовательской _routing, уникальность _id не гарантируется для всех фрагментов индекса. На самом деле, документы с одинаковыми _id могут оказаться на разных фрагментах, если индексированы с разными _routing значениями.

Пользователь должен самостоятельно гарантировать уникальность идентификаторов в рамках индекса.

Маршрутизация к разделу индекса

Индекс можно настроить таким образом, чтобы значения пользовательской маршрутизации попадали в подмножество фрагментов, а не в один фрагмент. Это помогает смягчить риск возникновения дисбаланса в кластере, сохраняя при этом снижение нагрузки на запросы.

Это делается путём предоставления параметра уровня индекса index.routing_partition_size при создании индекса. По мере увеличения размера раздела данные распределяются более равномерно, но запрос приходится выполнять на большем количестве фрагментов.

При наличии этого параметра формулы для вычисления фрагмента становятся:

routing_value = hash(_routing) + hash(_id) % routing_partition_size
shard_num = (routing_value % num_routing_shards) / routing_factor

То есть, поле _routing используется для вычисления набора фрагментов в индексе, а затем _id используется для выбора фрагмента в этом наборе.

Для активации этой функции значение index.routing_partition_size должно быть больше 1 и меньше index.number_of_shards.

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

  • Картирования с join полем отношениями не могут быть созданы в нём.
  • Все поля в индексе должны иметь поле _routing помеченное как обязательное.

© 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/mapping-routing-field.html

Spec-Zone.ru

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