常州网站建设系统,曲靖网站网站建设,多媒体展厅,关键词搜索量怎么查1#xff1a;一条数据是如何落地到对应的shard上的当索引一个文档的时候#xff0c;文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢#xff1f;首先这肯定不会是随机的#xff0c;否则将来要获取文档的时候我们就不知道从何处寻找了。…1一条数据是如何落地到对应的shard上的当索引一个文档的时候文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢首先这肯定不会是随机的否则将来要获取文档的时候我们就不知道从何处寻找了。实际上这个过程是根据下面这个算法决定的shard hash(routing) % number_of_primary_shardsrouting 是一个可变值默认是文档的 _id 也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数就是我们所寻求的文档所在分片的位置。这就解释了为什么我们要在创建索引的时候就确定好主分片的数量并且永远不会改变这个数量因为如果数量变化了那么所有之前路由的值都会无效文档也再也找不到了2路由机制现在我们在探讨一个关于路由的问题假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢1. 这个搜索的请求会被发送到一个节点2. 接收到这个请求的节点将这个查询广播到这个索引的每个分片上(可能是主分片也可能是复制分片)3. 每个分片执行这个搜索查询并返回结果4. 结果在通道节点上合并、排序并返回给用户因为默认情况下Elasticsearch使用文档的ID(类似于关系数据库中的自增ID)如果插入数据量比较大文档会平均的分布于所有的分片上这导致了Elasticsearch不能确定文档的位置所以它必须将这个请求广播到所有的N个分片上去执行这种操作会给集群带来负担增大了网络的开销路由使用PUT my_index/my_type/1?routinguser1refreshtrue{title: This is a document}GET my_index/my_type/1?routinguser1上面的代码中指定了一个用户属性作为路由进行分区然后查询的时候也必须指定路由。这一点需要注意 只要在索引时候加入路由字段那么在以后的getdeleteupdate操作中都必须使用路由字段否则会出现问题。有时候我们会把某些具有相似属性的数据放在同一个路由下这样可以提高查询的效率比如我们把不同季度的销售数据存储在不同的路由下然后在查询的时候直接根据路由字段本身进行查询即可而不需要直接扫描全年的数据PUT department1/order/1?routingjidu1{productName : phone,total_price : 10000000,times : 2017-01-01}PUT department1/order/2?routingjidu1{productName : huawei,total_price : 10000000,times : 2017-2-01}PUT department1/order/1?routingjidu2{productName : phone,total_price : 10009000,times : 2017-5-01}查询季度1的所有数据GET department1/_search{query: {terms : {_routing : [ jidu1 ]}}}查询季度1和季度2的所有数据GET department1/_search{query: {terms: {_routing: [ jidu1 , jidu2]}}}当然有时候我们需要查询第一、第二季度的产品中叫做huawei的文档。那么在查询中也是可以指定多个路由的GET department1/_search?routingjidu1,jidu2{query: {match: {productName: huawei}}}注意如果加入路由字段之后其他的操作(indexing,getting,deleting,updating)都必须指定路由字段为了避免在使用时忘记添加 路由字段导致同类数据会分布在多个shard上这就违反了路由的原则我们可以在mapping中 设置路由字段是必须字段否则会提示错误PUT department1{mappings: {order: {_routing: {required: true}}}}