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

news2024/11/28 12:54:48

使用 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

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

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

相关文章

Linux驱动开发笔记(九)IIC子系统及其驱动

文章目录 前言一、IIC驱动框架二、总线驱动2.1 iic总线的运行机制2.2 重要数据结构2.2.1 i2c_driver结构体2.2.2 i2c总线结构体 2.3 匹配规则 三、设备树的修改四、设备驱动的编写4.1 相关API函数4.1.1 i2c_add_adapter( )4.1.2 i2c_register_driver( )4.1.3 i2c_transfer( )4.…

Vue68-路由简介

一、路由的应用&#xff1a;&#xff08;单页面应用&#xff09; 单页面应用&#xff1a;页面不刷新&#xff0c;但是路径会改变。 二、路由的原理&#xff1a; 2-1、多页面应用&#xff1a; 2-2、路由的相关概念 2-3、前端路由、后端路由 前端路由&#xff1a;你是什么路径…

Spring Boot程序打包docker镜像

1.将springboot程序使用maven package打包出jar。 2.创建dockerfile。 FROM openjdk:8 VOLUME /tmp EXPOSE 8601 #ADD 后面的参数是项目名字 / 后面的参数是自定义的别名 ADD webflux-hello-0.0.1-SNAPSHOT.jar /webflux-hello.jar #这里的最后一个变量需要和前面起的别名相同…

Day15—热点搜索词统计

一、要求 根据用户上网的搜索记录对每天的热点搜索词进行统计&#xff0c;以了解用户所关心的热点话题。 要求完成&#xff1a;统计每天搜索数量前3名的搜索词&#xff08;同一天中同一用户多次搜索同一个搜索词视为1次&#xff09;。 二、数据 三、配置scala环境 1.下载sca…

Linux:用户账号和权限管理的命令

目录 一、Linux用户的分类和组的分类 1.1、用户账号和组账号 1.2、用户的分类 1.3、组账号 1.4、用户账号文件/etc/passwd 二、用户管理相关命令 2.1、chage命令&#xff1a;用来修改帐号和密码的有效期限&#xff0c;针对目前系统已经存在的用户 2.2、useradd&#xf…

八大经典排序算法

前言 本片博客主要讲解一下八大排序算法的思想和排序的代码 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;排序_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 …

Java——web开发

两个月前大概学完了JavaSE&#xff0c;老师推荐说&#xff0c;直接做项目&#xff0c;跟着尚硅谷的视频去做。但对于我来说&#xff0c;难度还是太大了&#xff0c;可能一下午才搞懂几行代码&#xff0c;学习效率不高&#xff0c;&#xff0c;没有成就感和充实感。于是&#xf…

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结

当 QPS 超过某个阈值的时候&#xff0c;则采取措施进行流量控制。流量控制的效果包括以下几种&#xff1a;直接拒绝、Warm Up、匀速排队/排队等待。对应 FlowRule 中的 controlBehavior 字段。 注意&#xff1a;若使用除了直接拒绝之外的流量控制效果&#xff0c;则调用关系限流…

【Redis】哈希类型的常用命令以及使用场景

Redis 哈希是一种用于存储键值对的数据结构。在 Redis 哈希中&#xff0c;每个键&#xff08;key&#xff09;都关联着一个哈希表&#xff08;hash&#xff09;。这个哈希表包含了多个字段&#xff08;field&#xff09;和值&#xff08;value&#xff09;。哈希非常适合存储对…

Java | Leetcode Java题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

44、基于深度学习的癌症检测(matlab)

1、基于深度学习的癌症检测原理及流程 基于深度学习的癌症检测是利用深度学习算法对医学影像数据进行分析和诊断&#xff0c;以帮助医生准确地检测癌症病变。其原理和流程主要包括以下几个步骤&#xff1a; 数据采集&#xff1a;首先需要收集包括X光片、CT扫描、MRI等医学影像…

【vite】define 全局常量定义

&#x1f9ed; define 说明 类型&#xff1a; Record<string, any> 定义全局常量替换方式。其中每项在开发环境下会被定义在全局&#xff0c;而在构建时被静态替换。 Vite 使用 esbuild define 来进行替换&#xff0c;因此值的表达式必须是一个包含 JSON 可序列化值&a…

xshell传输文件速率为0

你们好&#xff0c;我是金金金。 场景 此时我通过xshell客户端上传文件&#xff0c;速率一直为0 解决 安装 yum -y install lrzsz 即可 这个工具主要提供 rz 和 sz 命令&#xff0c;用于通过 Zmodem 协议在本地计算机和远程服务器之间传输文件 编写有误还请大佬指正&#xff0…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因&#xff1a;抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…

在Ubuntu系统中部署Java及Spring Boot开发环境

选择Java及Spring Boot构建Web服务具有显著优势&#xff0c;Java的跨平台兼容性保证了服务可在不同操作系统上顺畅运行&#xff0c;而Spring Boot的成熟框架则大大简化了开发流程&#xff0c;减少了繁琐配置。此外&#xff0c;强大的社区支持、易于维护与扩展的特性、优异的性能…

a-table 根据数据自动进行 行合并

<template><div class"chat_query_result"><button click"temp">点击</button><a-table :columns"columns" :data-source"data" bordered></a-table></div> </template><script&g…

计算机毕业设计hadoop+spark+hive游戏推荐系统 游戏数据分析可视化大屏 steam游戏爬虫 游戏大数据 大数据毕业设计 机器学习 知识图谱

游戏推荐系统开题报告 一、引言 随着信息技术和网络技术的飞速发展&#xff0c;电子游戏已成为人们日常生活中不可或缺的一部分。然而&#xff0c;面对海量的游戏资源&#xff0c;用户往往难以找到适合自己的游戏。因此&#xff0c;构建一个高效、准确的游戏推荐系统显得尤为…

C++ | Leetcode C++题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution { public:int titleToNumber(string columnTitle) {int number 0;long multiple 1;for (int i columnTitle.size() - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return num…

万界星空科技MES系统中的仓库管理功能

制造执行系统&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;作为一种面向车间生产调度的管理信息系统&#xff0c;被广泛应用在车间作业调度和控制管理系统中&#xff0c;它以实现车间生产调度最优化为目标。同时&#xff0c;MES作为衔接ERP&…

Scikit-Learn梯度提升决策树(GBDT)

Scikit-Learn梯度提升决策树 1、梯度提升决策树(GBDT)1.1、Boosting方法1.2、GBDT的原理1.3、GBDT回归的损失函数1.4、梯度下降与梯度提升1.5、随机森林与GBDT1.6、GBDT的优缺点2、Scikit-Learn梯度提升决策树(GBDT)2.1、Scikit-Learn GBDT回归2.1.1、Scikit-Learn GBDT回归…