路由
当你索引一个文档,它被保存在单个的主分片上,Elasticsearch如何知道文档属于哪个分片呢? 当我们创建一个新文档,它如何知道应该存储在分片1还是分片2上呢?
这个过程不能是随机的,因为我们将来需要取回该文档。 事实上,它是由一个非常简单的公式来决定的:
routing
值可以是任何的字符串, 默认是文档的 _id
,但也可以设置成一个自定义的值。 routing
字符串被传递到一个哈希函数以生成一个数字,然后除以索引的主分片的数量 得到余数 remainder. 余数将总是在 0
到 主分片数量 - 1
之间, 它告诉了我们用以存放 一个特定文档的分片编号。
这解释了为什么主分片的数量只能在索引创建时设置、而且不能修改。 如果主分片的数量一旦在日后进行了修改,所有之前的路由值都会无效,文档再也无法被找到。
所有文档 APIs (get
, index
, delete
, bulk
, update
和 mget
) 都可以接受 routing
参数,用以自定义 文档-到-分片 的映射。 自定义的路由将用于确保所有的文档 -- 例如属于同一用户的所有文档 -- 保存在相同的分片上。 我们将在 <<扩展>>
中详细讨论你为什么希望这么做。
Last updated