Solr原理剖析
一、简介
Solr是一个高性能、基于Lucene的全文检索服务器。Solr对Lucene进行了扩展,提供了比Lucene更为丰富的查询语言,并实现了强大的全文检索功能、高亮显示、动态集群,具有高度的可扩展性。同时从Solr 4.0版本开始,支持SolrCloud模式,该模式下能够进行集中式的配置信息、近实时搜索、自动容错等功能:
- 利用ZooKeeper作为协同服务,启动时可以指定把Solr的相关配置文件上传ZooKeeper,多机器共用。这些ZooKeeper中的配置不会再拿到本地缓存,Solr直接读取ZooKeeper中的配置信息。配置文件的变动,所有机器都可以感知到。
- 自动容错,SolrCloud对索引(collection)进行分片(shard),并对每个分片创建多个Replica。一个Replica出现异常并不会影响整个索引搜索服务,每个Replica都可以独立对外提供服务。
- 索引和查询时的自动负载均衡,SolrCloud索引(collection)的多个Replica可以分布在多台机器上,均衡索引和查询压力。如果索引和查询压力大,可以通过扩展机器,增加Replica来减缓压力。因此,下面的介绍主要是围绕SolrCloud展开描述的。
- Solr索引数据存储方法有多种,利用HDFS作为其索引文件的存储系统,提供高可靠性、高性能、可伸缩、准实时的全文检索系统;存放到本地磁盘,提供了更加快速的索引和查询速度。
Solr集群方案SolrCloud由多个SolrServer进程组成,如下图所示,模块说明如下表所示。

| 名称 | 说明 |
|---|---|
| Client | Client使用HTTP或HTTPS协议同Solr集群(SolrCloud)中的SolrServer进行通信,进行分布式索引和分布式搜索操作。 |
| SolrServer | SolrServer负责提供创建索引和全文检索等服务,是Solr集群中的数据计算和处理单元。 |
| ZooKeeper集群 | ZooKeeper为Solr集群中各进程提供分布式协作服务。各SolrServer将自己的信息(collection配置信息、SolrServer健康信息等)注册到ZooKeeper中,Client据此感知各个SolrServer的健康状态来决定索引和搜索请求的分发。 |
二、Solr基本概念
- Collection:在SolrCloud集群中逻辑意义上的完整的索引。它可以被划分为一个或者多个Shard,它们使用相同的Config
Set。 - Config Set:Solr Core提供服务必须的一组配置文件。包括solrconfig.xml和managed-schema等。
- Core:即Solr Core,一个Solr实例中包含一个或者多个Solr Core,每个Solr
Core可以独立提供索引和查询功能,每个Solr Core对应一个索引或者Collection的Shard的副本(replica)。 - Shard:Collection的逻辑分片。每个Shard都包含一个或者多个replicas,通过选举确定哪个是Leader。
- Replica:Shard的拷贝。一个Replica存在于Solr的一个Core中。
- Leader:赢得选举的Shard
replicas。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader再分发它们到Shard的全部replicas。 - ZooKeeper:它在SolrCloud是必须的,提供分布式锁、处理Leader选举等功能。
三、Solr原理
倒排序索引
传统的搜索方式(正排序索引,如下图所示)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,即通过KEY寻找VALUE。通过正排序索引进行搜索,就是从通过文档编号找关键词。

而Solr(Lucene)的搜索则是采用了倒排序索引(如下图所示)的方式,即通过VALUE找KEY。而在中文全文搜索中VALUE就是要搜索的关键词,存放所有关键词的地方叫词典。KEY是文档标号列表(通过文档标号列表可以找到出现过要搜索关键词–VALUE的文档),具体如下面的图所示:通过倒排序索引进行搜索,就是通过关键词查询相对应的文档编号,再通过文档编号找文档,类似于查字典,或通过查书目录查指定页码书的内容。

分布式索引操作流程
Solr分布式索引操作流程如下图所示。

操作流程说明如下:
- 当Client发起一次文档索引请求时,首先将从ZooKeeper集群中获取SolrCloud中SolrServer的集群信息,根据请求中的collection信息,获取任意一台包含该collection信息的SolrServer;
- Client把文档索引请求发送给SolrServer中该collection对应shard中的一个Replica进行处理;
- 如果该Replica不是Leader Replica,则该Replica会把文档索引请求再转发给和自己相同shard中相对应的Leader Replica;
- 该Leader Replica在本地完成文档的索引后,会再把文档索引请求路由给本Shard中的其他Replica进行处理;
- 如果该文档索引的目标shard并不是本次请求的Shard,那么该Shard的Leader Replica会将文档索引请求再次转发给目标Shard的Leader Replica;
- 目标Shard的Leader Replica在本地完成文档的索引后,会再把文档索引请求再次路由给本Shard的其他Replica进行处理。
分布式搜索操作流程:
Solr分布式搜索操作流程如下图所示。

操作流程说明如下:
- 当Client发起一次搜索请求时;Client首先将通过ZooKeeper会获取到SolrServer服务器集群信息,并随机选取一个含有该collection的SolrServer;
- Client把搜索请求发送到该Collection在SolrServer上相对应Shard中的任意一个Replica(可以不为Leader
Replica)进行处理; - 该Replica再根据查询索引的方式,启动分布式查询,基于Collection的Shard个数(在上图中为2个,Shard1和Shard2),把查询转换为多个子查询,并把每个子查询分发到对应Shard的任意一个Replica(可以不为Leader
Replica)中进行处理; - 每个子查询完成查询操作后,并查询结果返回;
- 首次收到查询请求的Replica收到各个子查询的查询结果后,对各个查询结果进行合并处理,然后把最终的查询结果返回给Client。
四、Solr和HDFS的关系
Solr是Apache基金会下的项目,也是Apache Hadoop项目生态系统中重要的一员,Solr可利用HDFS作为其索引文件存储系统。Solr位于结构化存储层,HDFS为Solr提供了高可靠性的存储支持。Solr中的所有索引数据文件都可以存储在HDFS文件系统上。
五、Solr和HBase的关系
HBase提供海量数据存储功能,是一种构建在HDFS上的分布式、面向列的存储系统。Solr索引HBase数据是将HBase数据写到HDFS的同时,Solr建立相应的HBase索引数据。其中索引id与HBase数据的rowkey对应,保证每条索引数据与HBase数据的唯一,实现HBase数据的全文检索。
相关文章:
Solr原理剖析
一、简介 Solr是一个高性能、基于Lucene的全文检索服务器。Solr对Lucene进行了扩展,提供了比Lucene更为丰富的查询语言,并实现了强大的全文检索功能、高亮显示、动态集群,具有高度的可扩展性。同时从Solr 4.0版本开始,支持SolrCl…...
解决 “无法将 ‘npm‘ 项识别为 cmdlet、函数、脚本文件或可运行程序的名称“ 错误的方法
系列文章目录 文章目录 系列文章目录前言一、错误原因:二、解决方法:三、注意事项:总结 前言 在使用 npm 进行前端项目开发时,有时会遇到错误信息 “无法将 ‘npm’ 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”&#x…...
Python 电商API 开发最佳实践
一、简介 当你打卡了一家北京最具有地中海特色的餐厅,当我们在餐厅点餐时,服务员会给我们一份菜单,菜单上列出了所有可供选择的菜品和饮料。我们可以在菜单上选择我们想要的食物和饮料,然后告诉服务员我们的选择。服务员会根据我…...
JAVA基础-集合(List与Map)
目录 引言 一,Collection集合 1.1,List接口 1.1.1,ArrayList 1.1.1.1,ArrayList的add()添加方法 1.1.1.2,ArrayList的remove()删除方法 1.1.1.3,ArrayList的contai…...
19 QListWidget控件
Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码: //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…...
手动安装docsify
安装docsify详见:docsify 1、下载 wget https://codeload.github.com/docsifyjs/docsify/zip/refs/heads/master -o docsify-master.zip 2、解压 unzip docsify-master.zip 3、移动文件到nginx的html所在目录【略】 4、配置nginx,示例如下 locati…...
yaml语法详解
#kv #对空格的严格要求十分高 #注入到我们的配置类中 #普通的keyvalue name: qinjiang#对象 student:name: qingjiangage: 3#行内写法 student1: {name: qinjiang,age: 3}#数组 pets:- cat- dog- pigpet: [cat,dog,pig]yaml可以给实体类赋值 person:name: kuangshenage: 19happ…...
ubuntu下tmux安装
目录 0. 前言1. Tmux介绍2. 安装3. 验证安装 0. 前言 本节安装tmux终端复用工具,在Ubuntu中运行一些服务或脚本的时候往往不能退出终端,需要一直挂着。在有图形界面的linux中你还可以新开一个终端去做别的事,但是在无界面linux中,…...
ssh打开远程vscode
如果想要远程打开其他终端的vscode,首先要知道远程终端的ip地址和用户名称以及用户密码 1、打开本地vscode 2、点击左下角蓝色区域 3、页面上部出现如下图,点击ssh,我这里已经连接,所以是connect to host 4、选择Add New SSH Host…...
Socket发送数据---winsock库和boost库
一个是通过winsock库提供的api实现,一个是boost库实现,两个方法都可以,因为项目是vc++6.0实现的,不支持boost库,只能使用winsock库,vc++6.0太老,局限性大。 通过Winsock库提供的API 通过UDP #include<winsock2.h> #include<vector> #include<WS2tcpip.h…...
Qt Core学习日记——第七天QMetaObject(上)
每一个声明Q_OBJECT的类都具有QMetaObject对象 Q_OBJECT宏源代码: #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ vir…...
100、用简洁的语言描述一下:TCP的三次握手和四次挥手(不需要长篇大论)
TCP的三次握手和四次挥手 TCP协议是7层网络协议中的传输层协议,负责数据的可靠传输。 1、三次握手 在建立TCP连接时,需要通过三次握手来建立,过程是: 客户端向服务端发送一个SYN服务端接收到SYN后,给客户端发送一个SYN_ACK客户…...
中南大学硕士论文latex版本全指导
要毕业了,闲下点时间写的东西。之前一直收益与师兄师姐流传下来的latex版本,用起来很舒服,希望后面的学弟学妹也能完美用上。latex功能很强大,不需要自己排版,只管内容即可,但是安装流程会多一丢丢。 目录 …...
RFC8470在HTTP中使用早期数据
摘要 使用TLS早期数据会暴露出重放攻击的可能性。本文定义了允许客户端与服务器就早期数据中发送的HTTP请求进行通信的机制。描述了使用这些机制来减轻重放风险的技术。 1. 介绍 TLS 1.3[TLS13]引入了早期数据(也称为零往返时间(0-RTT)数…...
macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载
macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Window…...
【LeetCode】62.不同路径
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? …...
使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案
为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path];和c PPAccountModel *account [NSKeyedUnarchiver unarchiveObjectWithFile:…...
python获取鼠标出颜色
import pyautogui as pg import keyboarddef rgb2hex(r, g, b):return #{:02x}{:02x}{:02x}.format(r, g, b)try:width, height pg.size()print(f"Display resolution: {width} * {height}\n") # 打印屏幕分辨率print(按下shift键打印出鼠标所指位置的颜色......)w…...
Github Flow工作流简单介绍(以部署为中心的开发模式)
前言 这篇文章主要介绍Github Flow的理念,以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式,通过简单的规则,持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型,它提供了一种更灵活…...
selenium浏览器驱动下载
Chrome谷歌浏览器 下载地址:http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的chromedriver.exe 版本也不一样,下载时不要搞错了。 如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。 Firefox火狐浏览器 驱…...
Ubuntu-24.04服务器磁盘扩容实战:从30GB到80GB的完整操作记录(附常见错误排查)
Ubuntu 24.04服务器磁盘扩容实战:从30GB到80GB的完整操作记录 最近在部署一套视频处理集群时,遇到了一个典型问题:某台运行Ubuntu 24.04 LTS的服务器在持续写入4K视频素材时,根分区突然爆满。这台当初只分配了30GB磁盘的服务器&am…...
Realistic Vision V5.1 虚拟摄影棚:网络编程基础之构建简易图像生成API服务器
Realistic Vision V5.1 虚拟摄影棚:网络编程基础之构建简易图像生成API服务器 你是不是也遇到过这样的情况:本地跑通了Realistic Vision V5.1模型,生成效果很棒,但想分享给同事或者集成到自己的应用里,就得让对方也装…...
SPIRE项目中的EJBCA上游证书颁发机构插件详解
SPIRE项目中的EJBCA上游证书颁发机构插件详解 【免费下载链接】spire SPIRE是一个开源的SPIFFE运行时环境,用于在Kubernetes集群中实现工作负载的身份识别和访问控制。 - 功能:工作负载身份识别;访问控制;身份凭证管理;…...
BiliTools:革新性开源B站资源下载工具,零基础也能轻松掌握的跨平台解决方案
BiliTools:革新性开源B站资源下载工具,零基础也能轻松掌握的跨平台解决方案 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode…...
深入解析IoU(Jaccard系数)在目标检测中的关键作用与高效实现
1. IoU究竟是什么?从基础概念到视觉理解 第一次接触目标检测时,我对着论文里满屏的"IoU"缩写发懵——这到底是个什么魔法指标?后来在调试YOLO模型时才发现,这个看似简单的比值,实际上是整个检测任务的基石性…...
终极指南:如何用DeepSpeech构建离线语音识别系统
终极指南:如何用DeepSpeech构建离线语音识别系统 【免费下载链接】DeepSpeech DeepSpeech is an open source embedded (offline, on-device) speech-to-text engine which can run in real time on devices ranging from a Raspberry Pi 4 to high power GPU serve…...
Ring-1T-FP8开源:万亿参数AI推理新突破
Ring-1T-FP8开源:万亿参数AI推理新突破 【免费下载链接】Ring-1T-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ring-1T-FP8 导语:近日,开源社区迎来重大突破——万亿参数级大语言模型Ring-1T-FP8正式开源ÿ…...
解锁游戏性能新境界:OptiScaler跨平台升级技术深度指南
解锁游戏性能新境界:OptiScaler跨平台升级技术深度指南 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler 在游戏图形技术…...
告别电子教材获取难题:tchMaterial-parser如何让资源下载效率提升8倍
告别电子教材获取难题:tchMaterial-parser如何让资源下载效率提升8倍 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 您是否曾为获取教学资源而在多个…...
4步攻克企业级Web表单开发:Dify工作流可视化实战指南
4步攻克企业级Web表单开发:Dify工作流可视化实战指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-W…...
