| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | [[mapping-routing-field]]=== `_routing` fieldA document is routed to a particular shard in an index using the followingformula:    shard_num = hash(_routing) % num_primary_shardsThe default value used for `_routing` is the document's <<mapping-id-field,`_id`>>or the document's <<mapping-parent-field,`_parent`>> ID, if present.Custom routing patterns can be implemented by specifying a custom `routing`value per document.  For instance:[source,js]------------------------------PUT my_index/my_type/1?routing=user1 <1>{  "title": "This is a document"}GET my_index/my_type/1?routing=user1 <2>------------------------------// AUTOSENSE<1> This document uses `user1` as its routing value, instead of its ID.<2> The the same `routing` value needs to be provided when    <<docs-get,getting>>, <<docs-delete,deleting>>, or <<docs-update,updating>>    the document.The value of the `_routing` field is accessible in queries, aggregations, scripts,and when sorting:[source,js]--------------------------GET my_index/_search{  "query": {    "terms": {      "_routing": [ "user1" ] <1>    }  },  "aggs": {    "Routing values": {      "terms": {        "field": "_routing", <2>        "size": 10      }    }  },  "sort": [    {      "_routing": { <3>        "order": "desc"      }    }  ],  "script_fields": {    "Routing value": {      "script": "doc['_routing']" <4>    }  }}--------------------------// AUTOSENSE<1> Querying on the `_routing` field (also see the <<query-dsl-ids-query,`ids` query>>)<2> Aggregating on the `_routing` field<3> Sorting on the `_routing` field<4> Accessing the `_routing` field in scripts (inline scripts must be <<enable-dynamic-scripting,enabled>> for this example to work)==== Searching with custom routingCustom routing can reduce the impact of searches.  Instead of having to fanout a search request to all the shards in an index, the request can be sent tojust the shard that matches the specific routing value (or values):[source,js]------------------------------GET my_index/_search?routing=user1,user2 <1>{  "query": {    "match": {      "title": "document"    }  }}------------------------------// AUTOSENSE<1> This search request will only be executed on the shards associated with the `user1` and `user2` routing values.==== Making a routing value requiredWhen using custom routing, it is important to provide the routing valuewhenever <<docs-index_,indexing>>, <<docs-get,getting>>,<<docs-delete,deleting>>, or <<docs-update,updating>> a document.Forgetting the routing value can lead to a document being indexed on more thanone shard.  As a safeguard, the `_routing` field can be configured to make acustom `routing` value required for all CRUD operations:[source,js]------------------------------PUT my_index{  "mappings": {    "my_type": {      "_routing": {        "required": true <1>      }    }  }}PUT my_index/my_type/1 <2>{  "text": "No routing value provided"}------------------------------// AUTOSENSE<1> Routing is required for `my_type` documents.<2> This index request throws a `routing_missing_exception`.==== Unique IDs with custom routingWhen indexing documents specifying a custom `_routing`, the uniqueness of the`_id` is not guaranteed across all of the shards in the index. In fact,documents with the same `_id` might end up on different shards if indexed withdifferent `_routing` values.It is up to the user to ensure that IDs are unique across the index.
 |