【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程

本教程记录了如何通过 IDEA 启动并调试 Solr 源码,从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式,本教程将以 Solr 9 为例进行演示,IDE 选择使用 IntelliJ IDEA。
Solr github 地址:https://github.com/apache/solr
JDK 版本:jdk17
关于系统版本可以参考:https://solr.apache.org/guide/solr/latest/deployment-guide/system-requirements.html

下载 Solr 源码并导入到 IDEA 中

可以从 github 上 clone 下载 java 源码:

git clone git@github.com:apache/solr.git 
# git clone https://github.com/apache/solr.git

亦或者下载相应版本的 java 源码包,如下图所示:
在这里插入图片描述

下载或 clone 好后,用 IDEA 打开 solr 源码,由于现在 Solr 使用 gradle 构建,IDEA 会自动识别 gradle 项目并进行加载,加载好后如下:
在这里插入图片描述
可以在项目的根目录下运行 ./gradlew dev 会构建 Solr 的开发发行版,其会在项目的 solr/packaging 目录下生成 build 目录,如下所示:

我们可以在 help 目录下查看一些关于项目的帮助说明,比如在 formatting.txt 中,如下所示:
在这里插入图片描述
提到了项目使用了 goole-java-format 来风格化代码,所以如果更改 Solr 源码后,我们可以使用 ./gradlew tidy 来风格化代码,亦或者 IDEA 安装 goole-java-format 插件并应用于 Solr 项目。

运行 StartSolrJetty 启动 Solr 服务(非 SolrCloud 方式运行)

如果我们不以 SolrCloud 的方式启动 Solr 服务,我们可以修改 StartSolrJetty 来启动项目,具体做法如下:

  1. 定义 SolrHome 目录
    可以在本地电脑选择一个目录作为 SolrHome,SolrHome 是指 Apache Solr 的主目录,它是 Solr 实例运行的基础环境和配置的中心位置。这个目录包含了所有关键的配置文件、库文件、日志以及包含各个 Solr Core 数据的目录。
    比如我创建了本地目录 /Workspace/SolrHome/Solr9/standalone,之后把项目的solr/server/solr/solr.xml 文件拷贝至该目录下,如下所示:
    在这里插入图片描述
  2. 定义 SolrCore 目录
    之后我们在 /Workspace/SolrHome/Solr9/standalone 中创建一个 core 目录,把 solr/server/solr/configsets/_default/conf 的内容拷贝至该目录下,如下所示:
    在这里插入图片描述
    这里我创建了一个 core_default 目录,并把源码提供的 _default 的配置拷贝了到了这个目录下,这个目录作为演示的 Solr Core 目录。

什么是 Solr Core?
Solr Core 是 Apache Solr 中的一个基本构建块,它代表一个单独的可搜索的文档集合。每个 Solr Core 都包含其自己的索引文件、配置文件和与之相关的处理逻辑。这使得 Solr 能够在同一个 Solr 实例中同时运行多个搜索应用,每个应用拥有不同的数据和配置,但共享相同的资源。


Solr Core 的目录结构
Solr Core 的目录结构是 Solr 应用中管理索引和配置的关键部分。每个 Core 目录通常包含若干关键文件和子目录,这些组成部分确保了 Solr 能够高效地处理搜索请求和索引操作。

Solr Core 目录结构的关键组成部分:

  1. conf/:
    • solrconfig.xml:控制 Solr Core 的操作和行为,包括搜索组件、请求处理器等。
    • schema.xml 或 managed-schema:定义索引中的字段和类型,是索引创建和查询的基础。
    • stopwords.txt:列出在索引过程中将被忽略的词汇,有助于优化搜索效率和准确性。
    • synonyms.txt:定义搜索中使用的同义词,增强搜索的灵活性和深度。
  2. data/:
    • 存放实际的索引数据,由 Lucene 管理,包括但不限于文档数据、索引文件等。
    • 这个目录的内容通常是动态变化的,随着文档的增加、更新和删除而更新。
  3. lib/:
    • 可选的目录,包含 Core 特定的 Java 类库文件。如果某个 Core 需要特殊的库而不是共享 Solr 实例中的库,则会使用这个目录。
  4. lang/:
    • 可选的目录,包含支持多语言处理的配置文件,如语言分析器等。
  5. logs/:
    • 可选的目录,某些配置下 Solr Core 可能会在这里生成特定的日志文件。

功能和用途:

  • conf/ 目录是 Core 配置的核心,影响索引结构和搜索行为的所有方面。
  • data/ 目录是索引和搜索操作的物理基础,直接关联到性能和存储。
  • lib/ 和 lang/ 目录提供了扩展性和灵活性,使得每个 Core 能够根据特定需求定制功能。
  1. 修改 StartSolrJetty 类,并启动
    在项目中找到 StartSolrJetty.java 这个类,如下图所示:

    我们需要对这个类的main方法做简单的修改,具体代码如下:
    public static void main(String[] args) {// System.setProperty("solr.solr.home", "../../../example/solr");// 这里需要填写之前创建的 SolrHome 的绝对路径System.setProperty("solr.solr.home", "/Workspace/SolrHome/Solr9/standalone");Server server = new Server();ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory());// Set some timeout options to make debugging easier.connector.setIdleTimeout(1000 * 60 * 60);connector.setPort(8983);server.setConnectors(new Connector[] {connector});WebAppContext bb = new WebAppContext();bb.setServer(server);bb.setContextPath("/solr");// bb.setWar("webapp/web");// 这里需要填写 Solr 源码的 `solr/webapp/web` 的绝对路径bb.setWar("/Workspace/source-code/solr/solr/webapp/web");//    // START JMX SERVER//    if( true ) {//      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();//      MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);//      server.getContainer().addEventListener(mBeanContainer);//      mBeanContainer.start();//    }server.setHandler(bb);try {System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");server.start();while (System.in.available() == 0) {Thread.sleep(5000);}server.stop();server.join();} catch (Exception e) {log.error("failed to start", e);System.exit(100);}}
    
    在代码中,我们需要指定 SolrHome 的绝对路径以及 Solr 的 webapp/web 的绝对路径,webapp/web 目录对应项目目录如下:

    之后运行启动这个类:
    在这里插入图片描述
    浏览器访问:http://localhost:8983/solr,页面如下:
    在这里插入图片描述
  2. 创建 Core
    如下所示:
    在这里插入图片描述
    我们添加一个 Core,这里的 instanceDir 就是刚才我们创建的 Core 目录的名称,添加好后,如下所示,可以看到添加的 Core 名称为 example_demo 同时会在 Core 目录下多出了 data 索引目录以及 core.properties Core 属性文件
    在这里插入图片描述
    在如下页面可以运行查询:
    在这里插入图片描述
  3. 断点调试 Solr 源码
    如果 StartSolrJetty 是以 debug 方式运行的,你可以在项目中打断点调试 Solr 源码,Solr 的请求入口在 SolrDispatchFile.doFilter 处,如下所示:
    在这里插入图片描述

以 SolrCloud 方式运行 Solr 源码

如果想通过 SolrCloud 方式运行并调试 Solr 源码,我们需要创建一个运行应用,具体操作如下所示:

  1. 运行 ./gradlew dev 构建 Solr 开发发行版
    在项目中我们可以运行 ./gradlew dev 构建 Solr 开发发行版,或者在 IDEA 中,在 gradle 面板运行,如下图所示:

    运行成功后,会在 solr/server/build 目录下生成 packaging 目录,如下所示:

  2. 引入 start.jar 依赖项
    上面打包后的目录可以看到有一个 start.jar jar 包,打开项目结构,选择 server 模块,将这个 jar 包添加到依赖项中,如下所示:
    在这里插入图片描述

  3. 新建 solrcloud 应用
    在 IDEA 右上角,如下图所示:
    在这里插入图片描述
    选择 Edit Configurations,之后添加一个 Application 如下所示:

    按下图所示编辑应用:
    在这里插入图片描述
    之后选择 Modify options -> Add VM options
    在这里插入图片描述
    并在 VM options 中添加如下内容:

    -DzkHost=127.0.0.1:2181/solr9
    -Dsolr.jetty.host=0.0.0.0
    -Djetty.port=8983
    -Duser.timezone=UTC
    -Djetty.home=/Workspace/source-code/solr/solr/server
    -Dsolr.solr.home=/Workspace/SolrHome/Solr9/SolrHome_1
    -Dsolr.install.dir=/Workspace/source-code/solr/solr
    -Dsolr.log.dir=/Workspace/SolrHome/Solr9/logs/solr_1
    -Dsolr.log=/Workspace/SolrHome/Solr9/logs/solr_1/solr.log
    -Dlog4j.configurationFile=file:/Workspace/source-code/solr/solr/server/resources/log4j2.xml
    

    注意上面启动参数的路径要改成你自己的,而且要确保你本地是有启动 ZooKeeper 的,上面启动项的含义如下:

    启动项的详细解释:

    1. -DzkHost=127.0.0.1:2181/solr9
      • 指定 Solr 连接到的 ZooKeeper 主机和端口。此属性对于 SolrCloud 模式是必需的,因为它协调集群状态。127.0.0.1:2181 表示 ZooKeeper 运行在本地机器的 2181 端口上,/solr9 是 Solr 使用的 ZooKeeper 的 chroot 路径,它将所有 Solr 相关的数据隔离在这个路径下。
    2. -Dsolr.jetty.host=0.0.0.0
      • 设置 Jetty 服务器绑定的 IP 地址。使用 0.0.0.0 表示接受所有网络接口上的连接,使得任何远程机器都可以访问此 Solr 实例。
    3. -Djetty.port=8983
      • 指定 Jetty 服务器监听的端口号。8983 是 Solr 默认的端口号。
    4. -Duser.timezone=UTC
      • 设置运行 Solr 进程的时区为协调世界时(UTC)。这有助于确保时间的统一性,尤其是在多时区的环境中操作数据时。
    5. -Djetty.home=/Workspace/source-code/solr/solr/server
      • 指定 Jetty 的安装目录。这是 Jetty 服务器寻找其配置文件和库文件的地方。
    6. -Dsolr.solr.home=/Workspace/SolrHome/Solr9/SolrHome_1
      • 设置 Solr 的主目录(SolrHome),Solr 将从这个目录加载其配置文件、核心等信息。
    7. -Dsolr.install.dir=/Workspace/source-code/solr/solr
      • 指定 Solr 的安装目录,Solr 会在这个目录下查找它的一些核心库文件。
    8. -Dsolr.log.dir=/Workspace/SolrHome/Solr9/logs/solr_1
      • 设置 Solr 日志文件的存储目录。这是 Solr 存放日志文件的位置,有助于日志管理和故障排查。
    9. -Dsolr.log=/Workspace/SolrHome/Solr9/logs/solr_1/solr.log
      • 设置 Solr 的日志文件路径。指定具体的日志文件名称和路径,通常用于定制日志文件的存储位置和命名。
    10. -Dlog4j.configurationFile=file:/Workspace/source-code/solr/solr/server/resources/log4j2.xml
      • 指定 Log4j 2 的配置文件路径。这个文件定义了日志管理的配置,包括日志级别、输出格式和输出目的地等。

    之后选择 Working directory 为 项目的 solr/server/build/packaging 目录,如下所示:
    在这里插入图片描述
    填写 Program arguments--module=http,配置完毕如下所示:
    在这里插入图片描述
    点击应用并确定。

  4. 运行调试程序
    如下所示以 Debug 方式运行
    在这里插入图片描述
    由于我本地启动了 ZooKeeper,solr9 路径如下:
    在这里插入图片描述
    启动 solrcloud 后,会初始化一些配置到 ZooKeeper 中,如下所示:
    在这里插入图片描述
    程序启动成功,同时:

    Zookeeper 节点写入了一些数据
    访问 http://localhost:8983/solr 页面如下:
    在这里插入图片描述
    可以看到 SolrCloud 模式下页面有些许不同,当然我们也可以在 SolrDispatchFilter 中打断点,断点依旧会进来:
    在这里插入图片描述

SolrCloud 模式下上传配置和创建 Collection

此时由于 Zookeeper 中没有 Collection 的配置所以此时我们只能创建 _default 配置的 Collection,此时我们可以运行 Solr 代码的 ZkCLImain 方法把我们本地的 Collection 配置上传至 Zookeeper 中。
如下所示:
在这里插入图片描述
源码中我们找到 org.apache.solr.cloud.ZkCLI 这个类,运行 main 方法后,控制台会打印出使用帮助,由此可知如何上传配置,比如我本地有一个 MOVIE 的配置文件,如下所示:

这时,我们需要编辑 ZkCLI 的程序参数,在程序启动参数(Program Arguments)中填写如下内容:
在这里插入图片描述
之后运行程序,访问 Zookeeper,如下所示,可以看到配置文件已上传到指定的 ZK 目录下
在这里插入图片描述
在创建 Collection 的页面上也可同时看到有了 MOVIE 的选项:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络(CNN)2.3 循环神经网络(RNN) 第三章 深度学习的应用实…

AI交互及爬虫【数据分析】

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

区块链实验室(37) - 交叉编译百度xuperchain for arm64

纠结了很久,终于成功编译xuperchain for arm64。踩到1个坑,说明如下。 1、官方文档是这么说的:go语言版本推荐1.5-1.8 2、但是同一个页面,又是这么说的:不推荐使用1.11之前的版本。 3、问题来了:用什么版本…

2024年特种设备(门式起重机司机)考试真题题库。

181."ZZ"表示钢丝绳为( )。 A.右同向捻 B.左同向捻 C.右交互捻 D.左交互捻 答案:A 182.桥式起重机的金属结构主要由起重机桥架(又称大车桥架)、( )和操纵室(司机室)…

提升工作效率的实体和虚拟工具推荐

在现代工作中,我们常常需要利用各种工具来提高工作效率。本文将介绍一款实体工具和一款虚拟工具,它们都能够有效地提升工作效率,让我们更高效地完成任务。 实体工具:金鸣表格文字识别大师 金鸣表格文字识别大师是一款优秀的文字识…

Day 32:503. 下一个更大的元素Ⅱ

Leetcode 503. 下一个更大的元素Ⅱ 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它…

Ltv 数据粘包处理

测试数据包的生成 校验程序处理结果和原始的日志保温解析是否一致 程序粘包分解正常

【NPS】哑终端设备如何实现域VLAN动态分配

在【NPS】微软NPS配置802.1x,验证域账号,动态分配VLAN(有线网络续篇)中,已经通过C3PL策略配置实现了802.1x验证没有通过时,自动分配一个Guest VLAN,以确保用户至少能够访问基本的网络服务。问题…

mysql学习——SQL中的DQL和DCL

SQL中的DQL和DCL DQL基本查询条件查询聚合函数分组查询排序查询分页查询 DCL管理用户权限控制 学习黑马MySQL课程,记录笔记,用于复习。 DQL DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记…

Windows资源管理器down了,怎么解

ctrlshiftesc 打开任务管理器 文件 运行新任务 输入 Explorer.exe 资源管理器重启 问题解决 桌面也回来了

java基于ssm+jsp 美好生活日志网

1前台首页功能模块 九宫格日志网站,在系统首页可以查看首页、日记信息、美食信息、景点信息、新闻推荐、日志展示、论坛信息、新闻资讯、留言反馈、我的、跳转到后台等内容,如图1所示。 图1前台首页功能界面图 用户注册,在用户注册页面可以填…

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是实现多版本并发控制(MVCC)下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性,也就是事务中的操作要…

【CentOS 7】深入指南:使用LVM和扩展文件系统增加root分区存储容量

【CentOS 7】深入指南:使用LVM和扩展文件系统增加root分区存储容量 大家好 我是寸铁👊 【CentOS 7】深入指南:使用LVM和扩展文件系统增加root分区存储容量 ✨ 喜欢的小伙伴可以点点关注 💝 前言 在运行CentOS 7服务器或虚拟机时&a…

【扫雷游戏】C语言详解

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

【Python系列】FastAPI 中的路径参数和非路径参数解析问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【计算机网络体系结构】计算机网络体系结构实验-FTP实验

1. 2. 3. wireshark 第一行:帧Frame 545:要发送的数据块,所抓帧的序号为545,捕获字节数等于传送字节数:451字节第二行:源Mac地址为a4:bb:6d:6e:28:9a;目标Mac地址为24:00:fa:e4:df:d8第三行&…

无线麦克风哪个品牌音质最好,一文告诉你无线领夹麦克风怎么挑选

随着直播带货和个人视频日志(Vlog)文化的兴起,以及自媒体内容创作的蓬勃发展,我们见证了麦克风行业的迅猛发展。在这一浪潮中,无线领夹麦克风以其无与伦比的便携性和操作效率,迅速赢得了广大视频制作者的喜…

如何使用mapXplore将SQLMap数据转储到关系型数据库中

关于mapXplore mapXplore是一款功能强大的SQLMap数据转储与管理工具,该工具基于模块化的理念开发,可以帮助广大研究人员将SQLMap数据提取出来,并转储到类似PostgreSQL或SQLite等关系型数据库中。 功能介绍 当前版本的mapXplore支持下列功能…

「动态规划」如何求最长摆动子序列的长度?

376. 摆动序列https://leetcode.cn/problems/wiggle-subsequence/description/ 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也…

ONLYOFFICE 8.1全新升级,智能办公体验再升级,引领未来工作新潮流!

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ONLYOFFICE 8.1 📒1. ONLYOFFICE简介📙2. ONLYOFFICE特点📕3. ONLYOFFICE功能⛰️PDF 文件编辑器&#x1…