Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.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 для каждого документа. Например:

resp = client.index(
    index="my-index-000001",
    id="1",
    routing="user1",
    refresh=True,
    document={
        "title": "This is a document"
    },
)
print(resp)

resp1 = client.get(
    index="my-index-000001",
    id="1",
    routing="user1",
)
print(resp1)
response = client.index(
  index: 'my-index-000001',
  id: 1,
  routing: 'user1',
  refresh: true,
  body: {
    title: 'This is a document'
  }
)
puts response

response = client.get(
  index: 'my-index-000001',
  id: 1,
  routing: 'user1'
)
puts response
const response = await client.index({
  index: "my-index-000001",
  id: 1,
  routing: "user1",
  refresh: "true",
  document: {
    title: "This is a document",
  },
});
console.log(response);

const response1 = await client.get({
  index: "my-index-000001",
  id: 1,
  routing: "user1",
});
console.log(response1);
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 доступно в запросах:

resp = client.search(
    index="my-index-000001",
    query={
        "terms": {
            "_routing": [
                "user1"
            ]
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      terms: {
        _routing: [
          'user1'
        ]
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    terms: {
      _routing: ["user1"],
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

Выполнение запроса на поле _routing (см. также ids запрос)

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

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

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

resp = client.search(
    index="my-index-000001",
    routing="user1,user2",
    query={
        "match": {
            "title": "document"
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  routing: 'user1,user2',
  body: {
    query: {
      match: {
        title: 'document'
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  routing: "user1,user2",
  query: {
    match: {
      title: "document",
    },
  },
});
console.log(response);
GET my-index-000001/_search?routing=user1,user2 
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}

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

Требование значения маршрутизации

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

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

resp = client.indices.create(
    index="my-index-000002",
    mappings={
        "_routing": {
            "required": True
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000002",
    id="1",
    document={
        "text": "No routing value provided"
    },
)
print(resp1)
response = client.indices.create(
  index: 'my-index-000002',
  body: {
    mappings: {
      _routing: {
        required: true
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000002',
  id: 1,
  body: {
    text: 'No routing value provided'
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000002",
  mappings: {
    _routing: {
      required: true,
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000002",
  id: 1,
  document: {
    text: "No routing value provided",
  },
});
console.log(response1);
PUT my-index-000002
{
  "mappings": {
    "_routing": {
      "required": true 
    }
  }
}

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

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

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

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

При индексировании документов, указывая пользовательскую _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/8.17/mapping-routing-field.html

Spec-Zone.ru

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