_routing
field
使用以下公式将文档路由到索引中的特定分片:
shard_num = hash(_routing) % num_primary_shards
_routing
使用的默认值是文档的 [_id
] 或文档的 [_parent
]) ID(如果存在)。
7.14版本开始使用以下公式:
routing_factor = num_routing_shards / num_primary_shards
shard_num = (hash(_routing) % num_routing_shards) / routing_factor
num_routing_shards
is the value of the index.number_of_routing_shards
index setting.
num_primary_shards
is the value of the index.number_of_shards
index setting.
自定义路由模式可以通过为每个文档指定自定义routing
值来实现。 例如:
PUT my_index/my_type/1?routing=user1&refresh=true
{
"title": "This is a document"
}
GET my_index/my_type/1?routing=user1
该文档使用 user1
作为它的路由值,而不是它的 ID。
[getting]、[deleting],或 [update]文档时需要提供相同的_routing
的值。
_routing
字段的值可以在查询中访问:
GET my_index/_search
{
"query": {
"terms": {
"_routing": [ "user1" ]
}
}
}
查询_routing
字段(另见ids
查询)
自定义路由可以减少搜索的影响。 不必将搜索请求散布到索引中的所有分片,而是可以将请求发送到与特定路由值(或多个值)匹配的分片:
GET my_index/_search?routing=user1,user2
{
"query": {
"match": {
"title": "document"
}
}
}
此搜索请求将仅在与“user1”和“user2”路由值关联的分片上执行。
Making a routing value required使用自定义路由时,重要的是在 [indexing], [getting], [删除] 或 [更新]文档。
忘记路由值可能会导致文档在多个分片上建立索引。 作为保护措施,可以配置 _routing
字段以创建所有 CRUD 操作所需的自定义 routing
值:
PUT my_index2
{
"mappings": {
"my_type": {
"_routing": {
"required": true
}
}
}
}
PUT my_index2/my_type/1
{
"text": "No routing value provided"
}
my_type
文档需要路由。
这个索引请求会抛出一个 routing_missing_exception
。
在索引指定自定义 _routing
的文档时,不能保证索引中所有分片的 _id
的唯一性。 事实上,如果使用不同的_routing
值索引,具有相同_id
的文档可能会在不同的分片上结束。
由用户来确保 ID 在整个索引中是唯一的。
Routing to an index partition可以配置索引,以便自定义路由值将转到分片的子集而不是单个分片。 这有助于降低以不平衡集群告终的风险,同时仍然减少搜索的影响。
这是通过在以下位置提供索引级别设置 index.routing_partition_size
来完成的索引创建。 随着分区大小的增加,数据将变得越均匀,代价是每个请求必须搜索更多的分片。
当此设置存在时,计算分片的公式变为:
shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards
也就是说,_routing
字段用于计算索引内的一组分片,然后使用 _id
选择该组内的一个分片。
要启用此功能,index.routing_partition_size
的值应该大于 1 且小于 index.number_of_shards
。
从7.14开始
routing_value = hash(_routing) + hash(_id) % routing_partition_size
shard_num = (routing_value % num_routing_shards) / routing_factor
启用后,分区索引将具有以下限制:
- 不能在其中创建具有父子关系的映射。(5版本)
- 无法在其中创建具有join字段关系的映射。(6.X版本)
- 索引内的所有映射必须将
_routing
字段标记为必需。