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字段作爲一個必須傳遞的參數的配置。
其他的一些高級特性我們將在後續進行講解。