1. 概述
先说明此参数在使用一些高级的ES的特性的时候,经常用到,请认真理解。
文档在索引中利用下面的公式路由到特定的分片:shard_num = hash(_routing) % num_primary_shards
,_routing
字段的默认值使用的文档的_id字段。如果存在父文档,则使用文档的_parent
编号。
可以通过为每个文档指定一个自定义的路由值来实现自定义的路由方式。
2. 示例与理解
mappping定义和数据插入
PUT example
PUT example/docs/_mapping
{
"properties": {
"id": {"type": "long"},
"name": {"type": "text"}
}
}
#本文档使用user1其路由值代替其ID。与此同时,获取,删除或更新 文档routing时,需要提供相同的值
PUT example/docs/1?routing=user1
{
"id":1,
"name": "username1"
}
查询
_routing
字段可以在查询、聚合、脚本以及排序的时候访问。如下:
PUT example
PUT example/docs/_mapping
{
"properties": {
"id": {"type": "long"},
"name": {"type": "text"}
}
}
PUT example/docs/1?routing=user1
{
"id":1,
"name": "username1"
}
PUT example/docs/2?routing=user1
{
"id":2,
"name": "username2"
}
PUT example/docs/3?routing=user2
{
"id":3,
"name": "username3"
}
#查询
GET example/docs/_search
{
"query": {
"terms": {
"_routing": ['user1']
}
},
"aggs": {
"Routing values": {
"terms": {
"field": "_routing",
"size": 10
}
}
},
"sort": [
{
"_routing": {
"order": "desc"
}
}
],
"script_fields": {
"Routing values": {
"script": {
"source": "doc['_routing']"
}
}
}
}
作用
- 自定义路由可以降低搜索压力。搜索请求可以仅仅发送到匹配指定的路由值的分片,而不是广播到全部的分片。如下查询就是广播到所有分片的查询:
GET example/docs/_search?routing=user1,user2
{
"query": {
"match_all": {}
}
}
当我们使用自定义路由时,响应的文档的查询,删除或修改文档,都需要提供路由值,而忘记路由值会导致许多不必要的麻烦。而ES也提供了设置,把routing字段作为一个必须传递的参数的配置。
其他的一些高级特性我们将在后续进行讲解。