Solr9 如何使用 DIH 读取数据库索引数据

2024-06-21 00:04

本文主要是介绍Solr9 如何使用 DIH 读取数据库索引数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用 Solr 9 中的数据导入处理程序(DIH)

DIH(Data Import Handler)提供了一种可配置的方式向 Solr 中导入数据。
从 Solr 9 开始,数据导入处理程序(DIH)已经不再直接包含在 Solr 中,而是作为一个独立的项目存在。
在这里插入图片描述
在这里插入图片描述
本文将详细介绍如何在 Solr 9 中配置和使用 DIH,包括如何设置 Solr 环境和导入数据的具体步骤。

关于独立出来的 DIH 源码可以从:https://github.com/SearchScale/dataimporthandler?tab=readme-ov-file 中获取。

本示例将展示如何从源码启动 Solr 项目并配置 DIH。

安装和启动 Solr 服务

你可以自己在本地下载好 Solr 服务部署,截止到本博客的编写时间,Solr 的最新版是 9.6.1,我这里直接从 github 上 clone Solr 的源码,并将分支切到 releases/solr/9.6.1 版本标签,对应命令如下:

git checkout releases/solr/9.6.1

由于 Solr9 项目构建已从原来的 ant 方式更改为了 gradle 方式,我们将项目导入到 IDEA 中后,IDEA 会自动识别 gradle 项目。

在项目的根目录下我们可以执行 ./gradlew dev 命令,此命令执行后再项目的 solr/packaging/build 目录下会生成编译打包后的项目结构。

如下所示:
在这里插入图片描述

定义 SolrHome 目录并源码启动 Solr 服务

首先我们需要在本地电脑上选择一个目录作为我们的 SolrHome 目录,这里我选择 /Workspace/SolrHome/Solr9/test_demo 作为我的 SolrHome 目录,我们现在创建/Workspace/SolrHome/Solr9/test_demo 空目录,如下所示:
在这里插入图片描述
之后在项目的 solr/server/solr 目录下找到 solr.xml 将其拷贝到 /Workspace/SolrHome/Solr9/test_demo 目录下,如下所示:
在这里插入图片描述

IDEA 双击 Shift 键,查找 StartSolrJetty java 类,如下所示:
在这里插入图片描述
我们需要修改这个测试启动类,在代码中设置 SolrHome 和 webapp 的地址,修改后的内容如下:

public class StartSolrJetty {private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static void main(String[] args) {//System.setProperty("solr.solr.home", "../../../example/solr");// 此处设置 SolrHome 地址System.setProperty("solr.solr.home", "/Workspace/SolrHome/Solr9/test_demo");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/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);}}
}

修改好后,我们启动这个测试类的 main 方法,之后浏览器可以访问 http://localhost:8983/solr/#/,页面内容如下:
在这里插入图片描述

创建 SolrCore 目录并定义 Schema

在创建的 SolrHome 目录下,我们新建一个 movie_core_1 的子目录,如下所示:
在这里插入图片描述
之后复制Solr项目中 solr/configsets/_default/conf 目录下的配置文件到上面创建的 movie_core_1 目录下,如下图所示:
在这里插入图片描述
编辑 managed-schema.xml 文件,这里我删除了这个文件所有多余的配置,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="movie_config_demo" version="1.6"><!-- 定义字段类型 --><types><!-- 字符串类型,适用于文本,支持排序和docValues --><fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" /><!-- 整数点类型,适用于整数,支持docValues --><fieldType name="pint" class="solr.IntPointField" docValues="true"/><!-- 长整数点类型,适用于长整数,支持docValues --><fieldType name="plong" class="solr.LongPointField" docValues="true"/><!-- 双精度浮点数点类型,适用于浮点数,支持docValues --><fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/><!-- 日期点类型,适用于日期,支持docValues --><fieldType name="pdate" class="solr.DatePointField" docValues="true"/><!-- 文本字段类型,用于需要分词的文本 --><fieldType name="text" class="solr.TextField" omitNorms="true"><!-- 索引时的分析器配置 --><analyzer type="index"><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><filter class="solr.LowerCaseFilterFactory"/></analyzer><!-- 查询时的分析器配置 --><analyzer type="query"><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType></types><!-- 定义字段 --><fields><!-- 特殊的系统字段,用于乐观并发控制 --><field name="_version_" type="plong" indexed="false" stored="false"/><!-- 电影ID,唯一标识符 --><field name="MOVIE_ID" type="string" indexed="true" stored="true" required="true" multiValued="false"/><!-- 电影名称 --><field name="NAME" type="text" indexed="true" stored="true" required="true" multiValued="false"/><!-- 电影别名 --><field name="ALIAS" type="text" indexed="true" stored="true" multiValued="false"/><!-- 电影封面图片 --><field name="COVER" type="string" indexed="false" stored="true" multiValued="false"/><!-- 导演名单 --><field name="DIRECTORS" type="string" indexed="true" stored="true" multiValued="false"/><!-- 豆瓣评分 --><field name="DOUBAN_SCORE" type="pdouble" indexed="true" stored="true" multiValued="false"/><!-- 豆瓣投票数 --><field name="DOUBAN_VOTES" type="pint" indexed="true" stored="true" multiValued="false"/><!-- 电影类型 --><field name="GENRES" type="string" indexed="true" stored="true" multiValued="false"/><!-- 电影语言 --><field name="LANGUAGES" type="string" indexed="true" stored="true" multiValued="false"/><!-- 电影时长 --><field name="MINS" type="pdouble" indexed="true" stored="true" multiValued="false"/><!-- 官方网站 --><field name="OFFICIAL_SITE" type="string" indexed="false" stored="true" multiValued="false"/><!-- 制作地区 --><field name="REGIONS" type="string" indexed="true" stored="true" multiValued="false"/><!-- 上映日期 --><field name="RELEASE_DATE" type="pdate" indexed="true" stored="true" multiValued="false"/><!-- 剧情简介 --><field name="STORYLINE" type="text" indexed="true" stored="true" multiValued="false"/><!-- 标签 --><field name="TAGS" type="string" indexed="true" stored="true" multiValued="false"/><!-- 上映年份 --><field name="YEAR" type="pint" indexed="true" stored="true" multiValued="false"/><!-- 演员ID列表 --><field name="ACTOR_IDS" type="string" indexed="true" stored="true" multiValued="false"/><!-- 导演ID列表 --><field name="DIRECTOR_IDS" type="string" indexed="true" stored="true" multiValued="false"/></fields><!-- 定义主键 --><uniqueKey>MOVIE_ID</uniqueKey>
</schema>

由于上面的 schema 配置没有定义 text_general 字段,所以我们还需要修改 solrconfig.xml 配置文件,注释掉下面的代码内容:

    <!--<updateProcessor class="solr.AddSchemaFieldsUpdateProcessorFactory" name="add-schema-fields"><lst name="typeMapping"><str name="valueClass">java.lang.String</str><str name="fieldType">text_general</str><lst name="copyField"><str name="dest">*_str</str><int name="maxChars">256</int></lst>Use as default mapping instead of defaultFieldType<bool name="default">true</bool></lst><lst name="typeMapping"><str name="valueClass">java.lang.Boolean</str><str name="fieldType">booleans</str></lst><lst name="typeMapping"><str name="valueClass">java.util.Date</str><str name="fieldType">pdates</str></lst><lst name="typeMapping"><str name="valueClass">java.lang.Long</str><str name="valueClass">java.lang.Integer</str><str name="fieldType">plongs</str></lst><lst name="typeMapping"><str name="valueClass">java.lang.Number</str><str name="fieldType">pdoubles</str></lst></updateProcessor>--><!--<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields"><processor class="solr.LogUpdateProcessorFactory"/><processor class="solr.DistributedUpdateProcessorFactory"/><processor class="solr.RunUpdateProcessorFactory"/></updateRequestProcessorChain>-->

之后我们在 Solr Admin 页面创建这个 core,如下所示:
在这里插入图片描述
点击 Add Core ,创建好后如下所示:
在这里插入图片描述
当然此时会在 movie_core_1目录下生成 data 索引目录以及 core.properties 属性文件,如下所示:
在这里插入图片描述
查询测试:
在这里插入图片描述

配置 DIH

访问 https://github.com/SearchScale/dataimporthandler?tab=readme-ov-file 下载我们需要的 DIH jar 包,这里我直接下载的是源码:
在这里插入图片描述
打开下载好的源码:
在这里插入图片描述
可以看到项目中有 mariadb-java-client-2.6.0.jardata-import-handler-9.3.0.jar 两个 jar 包文件,我们需要将这两个 jar 包拷贝至 movie_core_1/lib 目录下,如下所示:
在这里插入图片描述
编写 solrconfig.xml 文件,新增如下配置:

<lib dir="./lib" />

如图:
在这里插入图片描述

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"><lst name="defaults"><str name="config">data-config.xml</str></lst>
</requestHandler>

如图:
在这里插入图片描述
之后再新增一个 data-config.xml 文件到 movie_core_1/conf 目录下,data-config.xml 内容如下:

<dataConfig><dataSource type="JdbcDataSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/movies" user="root" password="12345678" /><document><entity name="movie"query="SELECT movie_id, name, alias, cover, directors, douban_score, douban_votes, genres, languages, mins, official_site, regions, release_date, storyline, tags, CAST(year AS CHAR) AS year, actor_ids, director_ids FROM movie"><field column="movie_id" name="movie_id" /><field column="name" name="name" /><field column="alias" name="alias" /><field column="cover" name="cover" /><field column="directors" name="directors" /><field column="douban_score" name="douban_score" /><field column="douban_votes" name="douban_votes" /><field column="genres" name="genres" /><field column="languages" name="languages" /><field column="mins" name="mins" /><field column="official_site" name="official_site" /><field column="regions" name="regions" /><field column="release_date" name="release_date" dateTimeFormat="yyyy-MM-dd" /><field column="storyline" name="storyline" /><field column="tags" name="tags" /><field column="year" name="year" /><field column="actor_ids" name="actor_ids" /><field column="director_ids" name="director_ids" /></entity></document>
</dataConfig>

注意: 这里我是从 mysql 中查询表数据进行索引,所以需要 MySQL 的驱动包,需要从 https://mvnrepository.com/ 中下载 MySQL 的驱动 jar 包,将其拷贝至 movie_core_1/lib 目录下:在这里插入图片描述
在这里插入图片描述
我的 MYSQL 表结构如下:
在这里插入图片描述
表数据:https://github.com/lt5227/example_code/blob/main/spring_solr_example/sql/movies.sql

之后在 CoreAdmin 页面中选择 Relod,重新加载配置。
在这里插入图片描述
在浏览器中请求 http://localhost:8983/solr/movie_core_1/dataimport?command=full-import 接口,程序就会读取查询数据库进行全量索引了,请求后页面返回如下:
在这里插入图片描述
控制台日志如下:
在这里插入图片描述
测试查询:
在这里插入图片描述


官方文档
https://solr.apache.org/guide/8_6/uploading-data-with-index-handlers.html
https://solr.apache.org/guide/solr/latest/upgrade-notes/major-changes-in-solr-9.html#deprecations-and-removals

这篇关于Solr9 如何使用 DIH 读取数据库索引数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079635

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的