路由
最后更新于:2022-04-01 00:38:56
### 将文档路由到从库中
When you index a document, it is stored on a single primary shard. How doesElasticsearch know which shard a document belongs to? When we create a newdocument, how does it know whether it should store that document on shard 1 orshard 2?
The process can't be random, since we may need to retrieve the document in thefuture. In fact, it is determined by a very simple formula:
~~~
shard = hash(routing) % number_of_primary_shards
~~~
The `routing` value is an arbitrary string, which defaults to the document's`_id` but can also be set to a custom value. This `routing` string is passedthrough a hashing function to generate a number, which is divided by thenumber of primary shards in the index to return the _remainder_. The remainderwill always be in the range `0` to `number_of_primary_shards - 1`, and givesus the number of the shard where a particular document lives.
This explains why the number of primary shards can only be set when an indexis created and never changed: if the number of primary shards ever changed inthe future, all previous routing values would be invalid and documents wouldnever be found.
All document APIs (`get`, `index`, `delete`, `bulk`, `update` and `mget`)accept a `routing` parameter that can be used to customize the document-to-shard mapping. A custom routing value could be used to ensure that all relateddocuments -- for instance all the documents belonging to the same user -- arestored on the same shard. We discuss in detail why you may want to do this in<>.