1.默认查询接口会搜索所有的shard,但也可以指定routing字段,这样就只会查询routing计算出来的shard,提高查询速度。 --使用routing会导致docid不再全局唯一
使用方式也非常简单,只需在查询语句上面指定routing即可,允许指定多个:
-- 查询所有分区 GET route_test/_search { "query": { "match": { "data": "b" } } } -- 查询指定分区 GET route_test/_search?routing=key1,key2 { "query": { "match": { "data": "b" } } }
2.指定routing还有个弊端就是容易造成负载不均衡。所以ES提供了一种机制可以将数据路由到一组shard上面,而不是某一个。只需在创建索引时(也只能在创建时)设置index.routing_partition_size
,默认值是1,即只路由到1个shard,可以将其设置为大于1且小于索引shard总数的某个值,就可以路由到一组shard了。值越大,数据越均匀。
https://www.cnblogs.com/caoweixiong/p/12029789.html 参考
3.ES shard的实质是Lucene的索引,所以其实每个shard都是一个功能完善的倒排索引。