当前位置: 首页 > news >正文

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进程组成,如下图所示,模块说明如下表所示。
在这里插入图片描述

名称说明
ClientClient使用HTTP或HTTPS协议同Solr集群(SolrCloud)中的SolrServer进行通信,进行分布式索引和分布式搜索操作。
SolrServerSolrServer负责提供创建索引和全文检索等服务,是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分布式索引操作流程如下图所示。
在这里插入图片描述
操作流程说明如下:

  1. 当Client发起一次文档索引请求时,首先将从ZooKeeper集群中获取SolrCloud中SolrServer的集群信息,根据请求中的collection信息,获取任意一台包含该collection信息的SolrServer;
  2. Client把文档索引请求发送给SolrServer中该collection对应shard中的一个Replica进行处理;
  3. 如果该Replica不是Leader Replica,则该Replica会把文档索引请求再转发给和自己相同shard中相对应的Leader Replica;
  4. 该Leader Replica在本地完成文档的索引后,会再把文档索引请求路由给本Shard中的其他Replica进行处理;
  5. 如果该文档索引的目标shard并不是本次请求的Shard,那么该Shard的Leader Replica会将文档索引请求再次转发给目标Shard的Leader Replica;
  6. 目标Shard的Leader Replica在本地完成文档的索引后,会再把文档索引请求再次路由给本Shard的其他Replica进行处理。

分布式搜索操作流程:

Solr分布式搜索操作流程如下图所示。
在这里插入图片描述
操作流程说明如下:

  1. 当Client发起一次搜索请求时;Client首先将通过ZooKeeper会获取到SolrServer服务器集群信息,并随机选取一个含有该collection的SolrServer;
  2. Client把搜索请求发送到该Collection在SolrServer上相对应Shard中的任意一个Replica(可以不为Leader
    Replica)进行处理;
  3. 该Replica再根据查询索引的方式,启动分布式查询,基于Collection的Shard个数(在上图中为2个,Shard1和Shard2),把查询转换为多个子查询,并把每个子查询分发到对应Shard的任意一个Replica(可以不为Leader
    Replica)中进行处理;
  4. 每个子查询完成查询操作后,并查询结果返回;
  5. 首次收到查询请求的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中&#xff0c…...

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宏源代码&#xff1a; #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层网络协议中的传输层协议&#xff0c;负责数据的可靠传输。 1、三次握手 在建立TCP连接时&#xff0c;需要通过三次握手来建立&#xff0c;过程是: 客户端向服务端发送一个SYN服务端接收到SYN后&#xff0c;给客户端发送一个SYN_ACK客户…...

中南大学硕士论文latex版本全指导

要毕业了&#xff0c;闲下点时间写的东西。之前一直收益与师兄师姐流传下来的latex版本&#xff0c;用起来很舒服&#xff0c;希望后面的学弟学妹也能完美用上。latex功能很强大&#xff0c;不需要自己排版&#xff0c;只管内容即可&#xff0c;但是安装流程会多一丢丢。 目录 …...

RFC8470在HTTP中使用早期数据

摘要 使用TLS早期数据会暴露出重放攻击的可能性。本文定义了允许客户端与服务器就早期数据中发送的HTTP请求进行通信的机制。描述了使用这些机制来减轻重放风险的技术。 1. 介绍 TLS 1.3[TLS13]引入了早期数据&#xff08;也称为零往返时间&#xff08;0-RTT&#xff09;数…...

macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载

macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Window…...

【LeetCode】62.不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …...

使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

为何archiveRootObject和unarchiveObjectWithFile正常&#xff0c;而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的理念&#xff0c;以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式&#xff0c;通过简单的规则&#xff0c;持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型&#xff0c;它提供了一种更灵活…...

selenium浏览器驱动下载

Chrome谷歌浏览器 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的chromedriver.exe 版本也不一样&#xff0c;下载时不要搞错了。 如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。 Firefox火狐浏览器 驱…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...