solrcloud document路由

solrcloud的官方文档有对路由的简短介绍,可是不够详细和深刻。solrcloud有两种路由策略,一种是implicit(我的称之为手动路由) ,一种是compositeId(我的称之为自动路由);在建立collection的时候,若是没有指定路由方式,指定了numShards个数,默认是自动路由,即compositeId路由;反之是implicit路由。在solrcloud的admin界面上,能经过collection的state.json看获得collection的路由策略正则表达式

一、compositeId路由apache

    使用compositeId路由,在建立collection的时候必需要指定numShards(分片数)compositeId是一种不可扩展的路由策略。json

1.一、compositeId路由原理性能

在建立collection的时候,compositeId路由肯定的分片数(numShards),solr给每一片分配一个32bit hash范围。例如numShards=4,32位无符号范围是0-ffffffff(4294967295),那么每片的范围是spa


Shard3 : 0-1073741823
Shard4 : 1073741824-2147483647
code

Shard1 : 2147483648-3221225471
Shard2 : 3221225472-4294967295
router

在路由document的时候,compositeId路由会先计算document id的(例如document的unikey)murmurhash3 hash值,而后根据document id的hash值肯定文档路由到那个分片上。例如xml

document id 值为:abc索引

经过murmurhash3 hash在32bit上的值为:1073741836ci

经过比较,1073741836落在Shard4范围内,即该文档写入到Shard4中

compositeId路由不只限于经过document id计算murmurhash3 hash来肯定分片;还能够经过正则表达式来肯定分片,例如:

shard_key!document_id

!号前面是分片的key,这个key不必定非得是shard的名字,保证solr按照这个key计算一致就行;!号后面是文档id

shard_key 16 bit hash,取document_id 16bit hash拼接成一个32bit hash,用于肯定文档的路由。

例如,你须要为不一样的用户分shard,你可能会使用用户的名字或者ID做为一个前缀。好比你的用户是“juanpi”,若是你有一个文档的ID是“12345”,把前缀插入到文档的id字段中变成:“juanpi!12345”,在这里感叹号是一个分割符号,这里的“juanpi”定义了这个文档会指向一个特定的shard。

1.二、compositeId路由查询

而后在查询的时候,须要把这个前缀包含到_route_参数里面(好比:q=solr&_route_=juanpi!)使查询指向指定的shard。在某些状况下;这样操做能提高查询的性能,由于它省掉了须要在全部shard上发起http查询请求。

二、implicit路由

2.一、implicit路由原理

该路由方式须要外部指定document具体落在路由到哪一个Shard,这与compositeId路由方式索引可大体均匀分布在每一个shard上不一样;implicit路由是在外部控制,若是控制很差有可能分布不均匀。

在建立collection的时候,不指定shadNume,或者明确指出使用implicit路由,也能够指定使用某一个field(router.field)路由,这个参数定义了经过使用文档中的一个字段来肯定文档是属于哪一个shard的。可是,若是在一个文档中指定的字段没有值得话,这个文档Solr会拒绝处理。同时也可使用_route_参数来指定一个特定的shard。

也可使用solrj指定

利用solrJ新建索引时,须要在代码中指定索引具体落在哪一个shard上,添加代码:

doc.addField("_route_","shard_x");

同时在schema.xml添加字段

<field name="_route_" type="string"/>

2.二、implicit路由查询

因为建立collection是例如以下方式

http://localhost:8983/solr/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3

而添加document的时候,指定写入到shard1,shard2,shard3中的某一片,例如

doc.addField("_route_","shard3");

查询的时候到某个分片查询便可

 

三、扩展

3.一、compositeId路由方式扩展

compositeId路由,只能经过手动分裂某一片成两片,而后删除原来片的方式扩展

在分裂的过程当中,原分片的数据会大体均匀分红2份,复制到新生成的两个分片中

例如,原分片1万数据,分裂成两片后,每片大体5千数据

而后再手动删除原来(1万数据)的那片

3.二、implicit路由方式扩张

因为implicit路由在写入的时候指定了分片,因此能够自由的增长分片

相关文章
相关标签/搜索