企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片1 还是分片 2 中呢?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的: ``` shard = hash(routing) % number_of_primaryshards routing:是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值. number_of_primary_shards :主分片的数量. ``` 这个分布在 0 到 `number_of_primary_shards-1` 之间的余数,就是我们所寻求的文档所在分片的位置。 <br/> 这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。 <br/> 所有的文档 API( get 、 index 、 delete 、 bulk 、 update 以及 mget )都接受一个叫做 routing 的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中。