做异地送花网站,如何做网站规范,企业解决方案能力介绍,wordpress怎么自己写源码吗目录
1、compositeId路由
1.1、compositeId路由原理
1.2、compositeId路由查询
2、implicit路由
2.1、implicit路由原理
2.2、implicit路由查询
3、扩展
3.1、compositeId路由方式扩展
3.2、implicit路由方式扩张 solrcloud的官方文档有对路由的简短介绍#xff0c;但…目录
1、compositeId路由
1.1、compositeId路由原理
1.2、compositeId路由查询
2、implicit路由
2.1、implicit路由原理
2.2、implicit路由查询
3、扩展
3.1、compositeId路由方式扩展
3.2、implicit路由方式扩张 solrcloud的官方文档有对路由的简短介绍但是不够详细和深入。solrcloud有两种路由策略一种是implicit个人称之为手动路由 一种是compositeId个人称之为自动路由在创建collection的时候如果没有指定路由方式指定了numShards个数默认是自动路由即compositeId路由反之是implicit路由。在solrcloud的admin界面上能通过collection的state.json看得到collection的路由策略
1、compositeId路由 使用compositeId路由在创建collection的时候必须要指定numShards(分片数)。compositeId是一种不可扩展的路由策略。
1.1、compositeId路由原理
在创建collection的时候compositeId路由确定的分片数(numShards)solr给每一片分配一个32bit hash范围。例如numShards432位无符号范围是0-ffffffff4294967295那么每片的范围是 Shard3 : 0-1073741823 Shard4 : 1073741824-2147483647
Shard1 : 2147483648-3221225471 Shard2 : 3221225472-4294967295
在路由document的时候compositeId路由会先计算document id的例如document的unikeymurmurhash3 hash值然后根据document id的hash值确定文档路由到那个分片上。例如
document id 值为abc
通过murmurhash3 hash在32bit上的值为1073741836
通过比较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.2、compositeId路由查询
然后在查询的时候需要把这个前缀包含到_route_参数里面(比如qsolr_route_juanpi!)使查询指向指定的shard。在某些情况下这样操作能提升查询的性能因为它省掉了需要在所有shard上发起http查询请求。
2、implicit路由
2.1、implicit路由原理
该路由方式需要外部指定document具体落在路由到哪个Shard这与compositeId路由方式索引可大致均匀分布在每个shard上不同implicit路由是在外部控制如果控制不好有可能分布不均匀。
在创建collection的时候不指定shadNume或者明确指出使用implicit路由也可以指定使用某一个fieldrouter.field路由这个参数定义了通过使用文档中的一个字段来确定文档是属于哪个shard的。但是如果在一个文档中指定的字段没有值得话这个文档Solr会拒绝处理。同时也可以使用_route_参数来指定一个特定的shard。
也可以使用solrj指定
利用solrJ新建索引时需要在代码中指定索引具体落在哪个shard上添加代码
doc.addField(_route_,shard_x);
同时在schema.xml添加字段
field name_route_ typestring/
2.2、implicit路由查询
由于创建collection是例如如下方式
http://localhost:8983/solr/admin/collections?actionCREATEnametestimplicitrouter.nameimplicitshardsshard1,shard2,shard3
而添加document的时候指定写入到shard1,shard2,shard3中的某一片例如
doc.addField(_route_,shard3);
查询的时候到某个分片查询即可 3、扩展
3.1、compositeId路由方式扩展
compositeId路由只能通过手动分裂某一片成两片然后删除原来片的方式扩展
在分裂的过程中原分片的数据会大致均匀分成2份复制到新生成的两个分片中
例如原分片1万数据分裂成两片后每片大致5千数据
然后再手动删除原来1万数据的那片
3.2、implicit路由方式扩张
由于implicit路由在写入的时候指定了分片所以可以自由的增加分片