路由
OpenSearch 使用哈希算法将文档路由到索引中的特定分片。默认情况下,文档的 _id
字段用作路由值,但您也可以为每个文档指定自定义路由值。
默认路由
以下是默认的 OpenSearch 路由公式。_routing
值是文档的 _id
。
shard_num = hash(_routing) % num_primary_shards
自定义路由
在索引文档时,您可以指定自定义路由值,如下面的示例请求所示
PUT sample-index1/_doc/1?routing=JohnDoe1
{
"title": "This is a document"
}
在此示例中,文档使用值 JohnDoe1
进行路由,而不是默认的 _id
。
当检索、删除或更新文档时,您必须提供相同的路由值,如下面的示例请求所示
GET sample-index1/_doc/1?routing=JohnDoe1
按路由查询
您可以使用 _routing
字段根据文档的路由值进行查询,如下面的示例所示。此查询仅搜索与 JohnDoe1
路由值关联的分片。
GET sample-index1/_search
{
"query": {
"terms": {
"_routing": [ "JohnDoe1" ]
}
}
}
必需的路由
您可以将自定义路由设为索引上所有 CRUD 操作的必需项,如下面的示例请求所示。如果您尝试索引文档而未提供路由值,OpenSearch 将抛出异常。
PUT sample-index2
{
"mappings": {
"_routing": {
"required": true
}
}
}
路由到特定分片
您可以将索引配置为将自定义值路由到分片子集而不是单个分片。这是通过在创建索引时设置 index.routing_partition_size
来完成的。计算分片的公式为 shard_num = (hash(_routing) + hash(_id)) % routing_partition_size) % num_primary_shards
。
以下示例请求将文档路由到索引中的四个分片之一
PUT sample-index3
{
"settings": {
"index.routing_partition_size": 4
},
"mappings": {
"_routing": {
"required": true
}
}
}