Solr router 路由介绍_router:implicit-程序员宅基地

技术标签: Solr  

目录

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范围。例如numShards=4,32位无符号范围是0-ffffffff(4294967295),那么每片的范围是


Shard3 : 0-1073741823
Shard4 : 1073741824-2147483647

Shard1 : 2147483648-3221225471
Shard2 : 3221225472-4294967295

在路由document的时候,compositeId路由会先计算document id的(例如document的unikey)murmurhash3 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_参数里面(比如:q=solr&_route_=juanpi!)使查询指向指定的shard。在某些情况下;这样操作能提升查询的性能,因为它省掉了需要在所有shard上发起http查询请求。

2、implicit路由

2.1、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.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、扩展

3.1、compositeId路由方式扩展

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

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

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

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

3.2、implicit路由方式扩张

由于implicit路由在写入的时候指定了分片,所以可以自由的增加分片

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangshenghang/article/details/103682684

智能推荐

ajax跨域与cookie跨域_一级域名 的cookie ajax 请求二级域名时获取cookie-程序员宅基地

文章浏览阅读389次。ajax跨域ajax跨域取数据(利用可以跨域加载js的原理 functioncallback(){ }这是需要返回这样一个js函数)ajax数据类型使用jsonp :如 ajax{ url:..._一级域名 的cookie ajax 请求二级域名时获取cookie

Flutter从0到1实现高性能、多功能的富文本编辑器(基础实战篇)_flutter 富文本-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏2次。在上一章中,我们分析了一个富文本编辑器需要有哪些模块组成。在本文中,让我们从零开始,去实现自定义的富文本编辑器。注:本文篇幅较长,从失败的方案开始分析再到成功实现自定义富文本编辑器,真正的从0到1。— 完整代码太多, 文章只分析核心代码,需要源码请到代码仓库作为基础的富文本编辑器实现,我们需要专注于简单且重要的部分,所以目前只需定义标题、文本对齐、文本粗体、文本斜体、下划线、文本删除线、文本缩进符等富文本基础功能。//定义默认颜色​...///用户自定义颜色解析。_flutter 富文本

新一代异步IO框架——io_uring 架构-程序员宅基地

文章浏览阅读30次。近年来,Linux社区开发了一种新的异步IO框架,称为io_uring。io_uring通过提供高度可扩展和高性能的异步IO接口,有效地解决了传统异步IO框架中的一些性能瓶颈和限制。io_uring已经成为许多高性能应用程序的首选异步IO框架,为开发者提供了更好的IO处理能力。io_uring 架构是建立在Linux内核之上的,它使用了一组新的系统调用和内核机制,以提供高性能和低延迟的异步IO操作。io_uring的设计目标是提供一种简单而强大的接口,使得开发者可以轻松地利用异步IO的优势。

耗时一个月!期末熬夜复习整理 | 计算机网络(谢希仁第七版)大合集【知识点+大量习题讲解】_计算机网络期末复习题-程序员宅基地

文章浏览阅读2.5w次,点赞204次,收藏1.8k次。期末计网满绩计划教材:计算机网络(第七版)谢希仁版目录1. 概述2. 物理层3. 数据链路层(次重点)4. 网络层(重点)5. 运输层(重点)6. 应用层7. 网络安全最后1. 概述第一章概述2. 物理层第二章物理层3. 数据链路层(次重点)第三章数据链路层4. 网络层(重点)第四章网络层5. 运输层(重点)第五章运输层6. 应用层第六章应用层7. 网络安全稍后发布最后小生凡一,期待你的关注。..._计算机网络期末复习题

DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏18次。AA记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录NSNS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录SOASOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中标记哪一台是主服务器MXMX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录TXTTXT记录: 可任意填写,可为空。一_a记录

SpringBoot项目引入外部jar包_springboot引入外部jar包-程序员宅基地

文章浏览阅读695次。SpringBoot项目引入外部jar包_springboot引入外部jar包

随便推点

Hadoop 序列化机制_hadoop final-程序员宅基地

文章浏览阅读493次。序列化是指将结构化对象转化为字节流以便在网络上传输或者写到磁盘上进行永久存储的过程,反序列化是指将字节流转回结构化对象的逆过程序列化用于分布式处理的两大领域,进程间通信和永久存储。在Hadoop中,系统中多个节点上进程间的通信是通过“远程过程调用”(remote procedure call, RPC)实现的。RPC将消息序列化成二进制流后发送到远程节点,远程节点接着将二进制流饭序列化为原始..._hadoop final

tinymce富文本编辑器实现本地图片上传_tinymce images_upload_handler-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏6次。在开发过程中使用tinymce富文本编辑器,发现他的图片上传默认是上传网络图片那么如何实现上传本地图片呢,上官网逛一圈,发现其实很简单在官网中找到下面这张图片,并且有相关的例子这里,我使用了自定义函数images_upload_handler (blobInfo, success, failure) { const url = 'uploadImg' ..._tinymce images_upload_handler

SpringCloud-拜托!面试请不要再问我Spring Cloud底层原理实战_spring cloud +sql springcloud底层组件-程序员宅基地

文章浏览阅读2.6k次,点赞5次,收藏14次。上一篇我们说到《拜托!面试请不要再问我Spring Cloud底层原理》,我们大概了解了Spring Cloud中各个组件的作用以及其背后实现的原理。但是俗话说得好,实践是检验真理的唯一标准。这一篇我们动手实践一下,即搭建一个包含订单服务、库存服务、仓库服务、积分服务的微服务架构项目。一、项目的工程结构工程名 服务名 端口号 shop-parent 父工程 ..._spring cloud +sql springcloud底层组件

安装及配置py-faster-rcnn(亲测且详细)-程序员宅基地

文章浏览阅读819次。Ubuntu16.04下编译py-faster-rcnn全过程,在本机上试验成功,亲测有效,清晰总结踩过的坑,常见问题及解决方案一并给出_py-fast

Hausaufgabe--Python 08-程序员宅基地

文章浏览阅读89次。0-- print A/B/C/D rather than detail score:score = float(input('please input your score: '))if score>=90: print('A')elif 80<=score<90: print('B')elif 60<=score<80: print('C'...

linux下mkdir头文件_Linux下的创建目录函数——mkdir()-程序员宅基地

文章浏览阅读2.2k次。原型:int mkdir (const char *filename, mode_t mode)返回0表示成功,返回-1表述出错。使用该函数需要包含头文件sys/stat.hmode 表示新目录的权限,可以取以下值:S_IRUSRS_IREADRead permission bit for the owner of the file. On many systems this bit is 040..._linux mkdir 头文件