什么是路由
一个index的数据会被分为多片,每片都在一个shard中。所以说,一个document,只能存在于一个shard中。 当客户端创建document的时候,es此时就需要决定说,这个document是放在这个index的哪个shard上。 这个过程,就称之为document routing,数据路由。当ES散列文档的ID时 就会发生文档的路由,来决定文档应该索引到哪个分片中,这可以由你指定也可以让ES生成。
路由也可以不适用文档的ID,而是定制的数值进行散列。通过指定URL中的routing查询参数,系统将使用这个进行散列,而不是ID,
如下图:
为什么要使用路由?
如果你根本就不使用路由,Elasticsearch将确保你的文档以均衡的方式分布在所有不同的分片中,那么为什么还需要使用路由?定制路由允许你将分享同一个路由值得多篇文档归集到某个分片中,而一旦这些文档放入到同一索引中,就可以路由某些查询,让它们可以在索引分片得子集中执行(简而言之:根据指定的散列值决定相关文档放在哪些分片上)。
路由策略
路由策略需要在两个方面下功夫:在你索引文档的时候挑选合适的路由值,以及在执行查询的时候重用这些值。你首先需要决定一个良好的方式来分隔文档。
对get-together进行路由创建
针对上面3篇文档使用了3中不同的路由值,即denver,boulder,amsterdam。这意味着你使用了这些路由的散列值来决定哪些分片存放这些文档,而不是ID散列值。在索引阶段,这可能没有什么多大帮助;然而在查询阶段使用这些路由的时候,就可以减少数据的查询。如下:
上诉例子Elasticsearch接收到请求,它将对所提供的两个路由值,denver和amsterdam进行散列,然后再存放它们的分片上执行查询。这个例子中,denver和amsterdam散列到同一分片中,而boulder三列岛另一个不同的分片。
试想:如果对于100个分片的索引而言,如果能再索引和查询的时候指定每个分组的路由,你可以限制搜索请求的查询范围,扩展性可以进行很好的提升,同时,再查询的时候,不用在全部100个分片中进行执行,它可以运行得更快,对Elasticsearch得影响就更小。
如何知道路由如何散列。如何确定请求在哪个分片执行?
_search_shards API
可以通过该 API 知道搜索请求在哪些节点和分片上执行


配置路由
可以告诉Elasticsearch你想为所有的文档使用定制路由,并拒绝索引没有定制路由值得文档。如下例
小结
在有大量分片得索引时,路由会很有价值,当然对于Elasticsearch常规使用它并不是必须得。实际使用中,还是要根据项目需求进行调整