Solr原理剖析

news2024/10/5 20:26:44

一、简介

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数据的全文检索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Ansible自动化工具篇:ubuntu操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》

一、部署背景 由于业务系统的特殊性,我们需要针对不同的客户环境部署二进制版K8S集群,由于大都数用户都是专网环境,无法使用外网,为了更便捷,高效的部署,针对业务系统的特性,我这边编写了 基于a…

pytest 核心库 pluggy 详解

目录 前言: 代码案例 实例化: 添加到钩子定义中 (add_hookspecs): 注册插件 (register): 传递实现插件的实体类对象 运行插件 pm.hook.myhook(arg11, arg22):本质就是调用对象的call方法 前言: pytest 是一个广泛使用的自动化测试框架&#xff0c…

明星代言的益处:提升品牌价值与销售增长的有力策略

​在当今竞争激烈的商业世界中,企业为了脱颖而出,吸引更多目标消费者的关注,常常需要运用一系列巧妙的市场营销策略。而其中,明星代言无疑是一种备受瞩目的行之有效的手段。通过让明星成为产品或服务的代言人,企业能够…

freeBSD:(虚拟机和实体机)官网下载——安装

freebsdiso镜像获取 获取 FreeBSD | The FreeBSD Project 官网 根据你 计算机型号找对应的镜像,现在大部分都是amd64的 找寻你需要的镜像,我这里选择4g的镜像,点击即可下载 刻录u盘(虚拟机用户可以跳过) 这里我们使…

C# 存在重复元素

217 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2: 输…

【100天精通python】Day14:python 标准模块,自定义模块

目录 1 python 模块 2 标准模块 2.1 常见的标准模块 2.2 标准模块的导入 3 自定义模块 3.1 创建模块 3.2 导入模块 3.2.1 使用import 语句导入模块 3.2.2 使用from... import 语句导入模块 3.2.3 导入模块的全部定义 3.2.4 导入两个包含同名函数的模块 模块与函数的…

【Docker】Docker持续集成与持续部署(四)

前言: Docker与持续集成/持续部署(CI/CD)的作用是通过容器化技术实现环境一致性、快速构建和隔离性,从而加快软件交付速度、提高部署效率,确保持续集成和持续部署的顺利实施。 持续集成(Continuous Integra…

chrome解决http自动跳转https问题

1.地址栏输入: chrome://net-internals/#hsts 2.找到底部Delete domain security policies一栏,输入想处理的域名,点击delete。 3.再次访问http域名不再自动跳转https了。

1.项目需求-项目实现

1.项目需求-项目实现代码是依次迭代的 慢慢增加。 密码只能输入整数,密码一般用字符串,用户名和密码都用字符串实现 需要头文件 不识别内容 string需要头文件。c头文件里没有.h #include string 是c特有的类型。 总结:string 是c特有的类型…

【冷冻电镜】InSilicoTEM 使用手册

简介 InSilicoTEM是一个用来模拟生成冷冻电镜显微图像的软件,原论文是"Image formation modeling in cryo-electron microscopy"。 该软件基DIPImage和MATLAB开发。 (注:在GitHub上的代码,只适用于DIPImage2.9以及更早…

C# 父类实现的 IEquatable<T> 接口,重写的相等性判断函数都能被子类继承

实验代码 Son s1 new(), s2 new();Console.WriteLine("_ s1 s2"); _ s1 s2; Console.WriteLine();Console.WriteLine("_ s1 ! s2;"); _ s1 ! s2; Console.WriteLine();Console.WriteLine("_ s1.Equals(s2);"); _ s1.Equals(s2); Cons…

华为数通HCIP-BGP基础

AS(自治系统/路由域) 定义:运行相同路由协议,具有相同管理规则的区域(一般为一个企业网); 按照传递路由时是否携带掩码分类: 1、有类路由协议 路由传递时,无需携带掩…

linux下的tomcat

springboot项目端口是8080,部署到linux运行之后,为什么能检测到tomcat 手动安装tomcat,以下是在 Linux 系统上安装 Tomcat 的步骤: 下载 Tomcat 安装包。您可以从 Tomcat 官方网站(https://tomcat.apache.org/ ↗&…

Bagging方法6大面试热点问题

Q1:为什么Bagging算法的效果比单个评估器更好? 该问题其实是在考察Bagging方法降低模型泛化误差的基本原理。 泛化误差是模型在未知数据集上的误差,更低的泛化误差是所有机器学习/深度学习建模的根本目标。在机器学习当中,泛化误差…

python获取图片坐标系中的图形,将其展示到新的坐标系中,并存储到excel中

python获取图片坐标系中的图形,将其展示到新的坐标系中,并存储到excel中 1.原始图片 2.重新定义转换的图片 3.代码展示 import cv2 import numpy as np import matplotlib.pyplot as plt import pandas as pddef get_curve_vertices(lines):vertices…

【文末送书】Python高并发编程:探索异步IO和多线程并发

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜…

RISC-V汇编指令

写在最前面:这一篇是UC Berkeley的CS61C的笔记,根据我自己的理解进行学习记录,其中贴的一些图片来自于课程PPT。 了解汇编之前,我们需要先了解为什么需要汇编?以下是我的理解: 机器执行的命令都是些二进制…

六边形架构和分层架构的区别?

六边形架构和分层架构是什么? 六边形架构(Hexagonal Architecture)和分层架构(Layered Architecture)是两种常见的软件架构模式。六边形架构强调将核心业务逻辑与外部依赖解耦,通过接口与外部世界进行通信。…

hcip mgre与rip实验

要求: 1.toop搭建 2.IP地址规划 R1g 0/0/1 192.168.1.1 24 s 4/0/0 188.0.0.2 24 t:10.0.0.1 24R2 s 4/0/0 188.0.0.1 24 s 4/0/1 188.0.1.1 24 s 3/0/0 188.0.2.1 24 loop0 8.8.8.8 24 t:10.0.0.2 24 R3g…

本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源

作者:庄宇 在前一篇文章《应对突发流量,如何快速为自建 K8s 添加云上弹性能力》中,我们介绍了如何为 IDC 中 K8s 集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通…