# 路由

当你索引一个文档，它被保存在单个的主分片上，Elasticsearch如何知道文档属于哪个分片呢？ 当我们创建一个新文档，它如何知道应该存储在分片1还是分片2上呢？

这个过程不能是随机的，因为我们将来需要取回该文档。 事实上，它是由一个非常简单的公式来决定的:

```
分片 = hash(routing) % 主分片数量
```

`routing` 值可以是任何的字符串， 默认是文档的 `_id` ，但也可以设置成一个自定义的值。 `routing` 字符串被传递到一个哈希函数以生成一个数字，然后除以索引的主分片的数量 得到余数 *remainder*. 余数将总是在 `0` 到 `主分片数量 - 1` 之间, 它告诉了我们用以存放 一个特定文档的分片编号。

这解释了为什么主分片的数量只能在索引创建时设置、而且不能修改。 如果主分片的数量一旦在日后进行了修改，所有之前的路由值都会无效，文档再也无法被找到。

所有文档 APIs (`get`, `index`, `delete`, `bulk`, `update` 和 `mget`) 都可以接受 `routing` 参数，用以自定义 文档-到-分片 的映射。 自定义的路由将用于确保所有的文档 -- 例如属于同一用户的所有文档 -- 保存在相同的分片上。 我们将在 `<<扩展>>` 中详细讨论你为什么希望这么做。
