Solr4.8.0源码分析(27)之ImplicitDocRouter和CompositeIdRou

一样在公司工做中发现了一个现象,app

1.我用/solr/admin/collections?action=CREATE&name=collection&numShards=3&replicationFactor=2建立collectionui

2. delete其中的一个shardthis

3. 使用如下命令增长shard,/admin/collections?action=CREATESHARD&shard=shardName&collection=namespa

如此就会报如下错误:shards can be added only to ‘implicit’ collections。code

那么是什么缘由呢?问题就出在Solr的两种ROUTER方式ImplicitDocRouter和CompositeIdRouter。在SolrCloud的开发文档中有这句话:router

Shards can only created with this API for collections that use the ‘implicit’ router. Use SPLITSHARD for collections using the ‘compositeId’ router. A new shard with a name can be created for an existing ‘implicit’ collection.

也就是说在建立collections时候(若是指定参数numshards参数会自动切换到router=”compositeId”),若是采 用compositeId方式,那么就不能动态增长shard。若是采用的是implicit方式,就能够动态的增长shard。进一步来说:blog

  • ImplicitDocRouter就是和 uniqueKey无关,能够在请求参数或者SolrInputDocument中添加_route_(_shard_已废弃,或者指定field参数)参数获取slice ,(router=”implicit”) .ci

  • CompositeIdRouter就是根据uniqueKey的hash值获取slice,   (在指定numshards参数会自动切换到router=”compositeId”) .开发

综上所述,CompositeIdRouter在建立的时候因为指定了numshards参数即已经固定了hash区间,那么在update的时 候,根据uniqueid的hash坐落在那个hash区间来决定这份document数据发送至哪一个shard。而ImplicitDocRouter 则是在建立的时候并不选定每一个shard的hash区间,而是在须要update的document中增长_route_字段来存放须要发送的shard 名字,以此shard的名字来决定发送至哪一个shard。不难看出,相对来讲ImplicitDocRouter更加灵活。rem

在http://stackoverflow.com/questions/15678142/how-to-add-shards- dynamically-to-collection-in-solr中很好的介绍了动态建立/删除shard的好处 (ImplicitDocRouter)

复制代码

 1 One solution to the problem is to use the “implicit router” when creating your Collection. 2  3 Solr does supports the ability to add New Shards (or DELETE existing shards) to your index (whenever you want) via the “implicit router” configuration (CREATE COLLECTION API). 4  5 Lets say – you have to index all “Audit Trail” data of your application into Solr. New Data gets added every day. You might most probably want to shard by year. 6  7 You could do something like the below during the initial setup of your collection: 8  9 admin/collections?10 action=CREATE&11 name=AuditTrailIndex&12 router.name=implicit&13 shards=2010,2011,2012,2013,2014&14 router.field=year15 The above command: a) Creates 5 shards – one each for the current and the last 4 years 2010,2011,2012,2013,2014 b) Routes data to the correct shard based on the value of the “year” field (specified as router.field)16 17 In December 2014, you might add a new shard in preparation for 2015 using the CREATESHARD API (part of the Collections API) – Do something like:18 19 /admin/collections?20 action=CREATESHARD&21 shard=2015&22 collection=AuditTrailIndex23 The above command creates a new shard on the same collection.24 25 When its 2015, all data will get automatically indexed into the “2015” shard assuming your data has the “year” field populated correctly to 2015.26 27 In 2015, if you think you don’t need the 2010 shard (based on your data retention requirements) – you could always use the DELETESHARD API to do so:28 29 /admin/collections?30 action=DELETESHARD&31 shard=2015&32 collection=AuditTrailIndex

复制代码

 

转载请注明地址http://www.cnblogs.com/rcfeng/

相关文章
相关标签/搜索