【均匀】
默认,Elasticsearch会在所有索引的分片中均匀地分配文档;
为了获得文档,es必须查询所有分片并合并结果
【划分 路由】
允许数据按照一定的依据划分(例如,客户端标识符),就可以使用一个强大的文档查询和分布控制机制:路由;
简而言之,它允许选择用于索引和搜索数据的分片
【文档标识符散列值】
默认,es计算文档标识符的散列值,以此为基础将文档放置与一个可用的主分片上
例如,将单个用户的所有文档放置于单个分片之中,并对此分片查询:操作便利,路由允许
【可以再索引和查询时都指定路由值】
例如,索引时使用userId值来设置路由,在搜索时也一样:对于相同的userId值,计算出的散列值是相同的,因而特定用户的
所有文档被放置在相同的分片中;在搜索中使用相同的属性值,则只搜索当个分片而不是整个索引。
路由值的数量或许比索引分片的数量多:一些不同的属性值可以指向相同的分片;如果无过滤,则得到的数据并非单个路由的,而是特定分片中所有的路由值。
路由参数
建立文档
curl -XPUT 'http://localhost:9200/posts/post/1?routing=12' -d '{
"id":"1",
"name":"Test Document",
"contents":"test",
"userId":"12"
}'
查询文档
curl -XGET 'http://localhost:9200/posts/_search?routing=12&q=userId:12'
curl -XGET 'http://localhost:9200/posts/_search?routing=12,345&q=userId:12'
路由字段
为每个发送到es的请求指定路由值并不方便;
在索引过程中,es允许指定一个字段,用该字段的值作为路由值,这样只需要在查询时候提供路由参数。
"_routing":{
"required":true,
"path":"userId"
}
上述定义意味着需要提供路由值,否则索引请求失败。
使用索引字段较使用路由参数,es需要使用一些额外的解析,因此相对慢。