solr快速上手:配置从mysql同步数据(五)

news2025/1/17 18:05:32

0. 引言

上一节我们已经配置了新的索引,但是数据还是手动添加的,并没有实现自动从数据库同步,所以这一节,继续来实现从mysql同步数据到solr

solr快速上手:solr简介及安装(一)

solr快速上手:核心概念及solr-admin界面介绍(二)

solr快速上手:managed-schema标签详解(三)

solr快速上手:创建核心/索引/core(四)

1. 数据准备

1、要配置数据库同步,首先我们要确保我们managed-schema或者schema.xml配置文件中配置的字段和数据库中是能够对应的上的

订单表:
在这里插入图片描述
为了模拟关联表同步的效果,我们再创建一张标签子表:
订单标签表
在这里插入图片描述

CREATE TABLE `orders` (
  `id` bigint NOT NULL,
  `order_no` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `product_name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `create_user` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `remarks` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `status` int DEFAULT NULL,
  `address` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


CREATE TABLE `orders_label` (
  `id` int NOT NULL,
  `name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `order_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

再准备一些数据

# 订单表
INSERT INTO `orders` (`id`, `order_no`, `product_name`, `create_time`, `create_user`, `remarks`, `status`, `address`) VALUES (1, '202306010001', '苹果', '2023-06-01 23:22:26', 'mike', '送货上门,不想下楼', 1, '贵阳市观山湖xxx路');
INSERT INTO `orders` (`id`, `order_no`, `product_name`, `create_time`, `create_user`, `remarks`, `status`, `address`) VALUES (2, '202306010002', '凤梨', '2023-05-09 23:23:12', 'lili', '挑大个的', 1, '贵阳市花溪区ttt路');
INSERT INTO `orders` (`id`, `order_no`, `product_name`, `create_time`, `create_user`, `remarks`, `status`, `address`) VALUES (3, '202306010003', '草莓', '2023-06-01 23:24:20', 'ben', '要红的,注意新鲜', 2, '无锡市滨湖区yyy路');

# 标签表
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (1, '送货上门', 1);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (2, '生鲜', 1);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (3, '24小时', 1);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (4, '生鲜', 2);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (5, '保质服务', 2);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (6, '生鲜', 3);
INSERT INTO `orders_label` (`id`, `name`, `order_id`) VALUES (7, '24小时', 3);

2. 数据同步配置文件详解

我们实现数据同步的核心在于配置同步配置文件,该配置文件的核心标签和属性如下

  • dataSource 标签

用于声明同步的数据库地址、账号、密码、驱动器等连接信息
其中batchSize表示每次读取数据库的数量,-1表示不限制,如果同步的数据量较大,可以设置每次读取的限制,防止solr一次性建立索引数据过多导致的内存溢出问题
dataSource标签可以配置多个,用于声明多个数据源,比如需要跨库链接查询时使用,可以通过name标签声明数据库名称

<dataSource driver="com.mysql.cj.jdbc.Driver"
                url="jdbc:mysql://192.168.244.50:3306/test?useUnicode=true&amp;characterEncoding=UTF8&amp;autoReconnect=true&amp;zeroDateTimeBehavior=convertToNull"
                name="test"
                user="root" 
                password="123456" 
                batchSize="-1"/>
  • document 标签

document标签用于声明主要文档配置,核心子标签是entity

  • entity 标签

entity标签就是用来声明我们要同步的sql以及字段映射的,核心的属性如下

  • name 定义对应的solr中索引/核心名称
  • pk 主键字段名称,确保实体每一条记录唯一
  • dataSource 数据源,如果只有一个数据源时可以不用配置,与dataSource标签中的name属性对应
  • query 定义全量同步时的查询sql
  • deltaImportQuery 定义增量同步时的查询sql,自带的${dataimporter.delta.id}属性表示正在同步的数据的主键
  • deltaQuery 定义需要增量同步的id, d a t a i m p o r t e r . d e l t a . i d 的值也就来源于此, {dataimporter.delta.id}的值也就来源于此, dataimporter.delta.id的值也就来源于此,{dataimporter.last_index_time}表示上一次完成增量同步的时间,由系统自动记录生成
<entity name="orders"
                query="select id,order_no,product_name,create_time,create_user,remarks,status,address from orders"
                deltaImportQuery="select id,order_no,product_name,create_time,create_user,remarks,status,address from orders WHERE id='${dataimporter.delta.id}'"
                deltaQuery="SELECT id FROM orders WHERE create_time >= '${dataimporter.last_index_time}'">
            <field name="id" column="id"/>
            <field name="order_no" column="order_no"/>
            <field name="product_name" column="product_name"/>
            <field name="create_time" column="create_time"/>
</entity>

3. 实操

1、修改solrconfig.xml配置文件,配置数据库同步配置文件

# 进入solr安装目录
cd /data/solr-8.2.0
# orders是上一节创建的索引/核心 文件夹
vim server/solr/orders/solrconfig.xml

添加如下内容

  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-.*\.jar" />

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

2、在server/solr/orders下创建data-config.xml配置文件

这里需要注意,如果要配置父子表同步时再定义一个<entity>标签即可,其中的<field>中的name要与maneged-schema文件中定义的labels保持一致,具体如下

<entity name="lables" pk="id" 
        query="select name from orders_label where order_id = '${orders.id}'">
        <field name="labels" column="name"/>
</entity>

完整配置文件:

<?xml version="1.0" encoding="UTF-8" ?>

<dataConfig>
    <dataSource driver="com.mysql.cj.jdbc.Driver"
                url="jdbc:mysql://192.168.244.50:3306/test?useUnicode=true&amp;characterEncoding=UTF8&amp;autoReconnect=true&amp;zeroDateTimeBehavior=convertToNull&amp;serverTimezone=UTC&amp;tinyInt1isBit=false"
                user="root" password="123456" batchSize="-1"/>

    <document>
        <entity name="orders"
                query="select id,order_no,product_name,create_time,create_user,remarks,status,address from orders"
                deltaImportQuery="select id,order_no,product_name,create_time,create_user,remarks,status,address from orders WHERE id='${dataimporter.delta.id}'"
                deltaQuery="SELECT id FROM orders WHERE create_time >= '${dataimporter.last_index_time}'">
            <field name="id" column="id"/>
            <field name="order_no" column="order_no"/>
            <field name="product_name" column="product_name"/>
            <field name="create_time" column="create_time"/>
            <field name="create_user" column="create_user"/>
            <field name="remarks" column="remarks"/>
            <field name="status" column="status"/>
            <field name="address" column="address"/>
            <entity name="lables" pk="id" 
              query="select name from orders_label where order_id = '${orders.id}'">
                <field name="labels" column="name"/>
            </entity>
         </entity>
    </document>
</dataConfig>

3、在server/solr/orders/conf/下创建dataimport.properties配置文件

mkdir -p /data/solr-8.2.0/server/solr/orders/conf/
vim /data/solr-8.2.0/server/solr/orders/conf/dataimport.properties

配置内容为最后同步的时间,如果不填将会自动生成

orders.last_index_time=2023-06-04 02\:25\:05

4、添加jar包,因为我演示的数据库是mysql8.0,所以需要引入com.mysql.cj.jdbc.Driver的驱动器jar包,同时还要引入同步用的jar包solr-dataimporthandler*

(1)将solr安装路径/dist目录下的两个solr-dataimporthandler* jar包复制到server/solr-webapp/WEB-INF/lib

cd /data/solr-8.2.0 
cp dist/solr-dataimporthandler-* server/solr-webapp/webapp/WEB-INF/lib/

(2)将数据库驱动jar包(自己下载)也添加到server/solr-webapp/webapp/WEB-INF/lib

我这里因为采用的是mysql8.0,所以传输8.0版本的驱动器jar包

在这里插入图片描述

5、重启 solr

6、在solr-admin管理页面,Dataimport菜单中执行同步操作,选择full-import,第一次同步进行一次全量同步

在这里插入图片描述

7、如果发现没有同步成功,可以在Logging页面查看日志,点击具体的日志即可查看详情,如下所示,根据具体日志进行问题排查

同时也可在服务端日志server/logs/solr.log中查询详细报错堆栈信息

在这里插入图片描述

8、同步成功后,在输出页面会有绿色的标识,并告知同步了多少条数据

在这里插入图片描述

9、在Query菜单,查询全部数据,发现同步成功!
在这里插入图片描述

10、数据库新增一条数据

在这里插入图片描述

11、在solr-admin中点击delta-import进行增量同步,结果显示同步了一条新增数据

在这里插入图片描述

查询可以看到新增的数据

在这里插入图片描述

至此,我们全量和增量同步都成功了!

4. 常见报错

1. Error creating document : SolrInputDocument

问题:

Error creating document : SolrInputDocument(fields: [order_no=202306010001,​ address=贵阳市观山湖xxx路,​ create_time=2023-06-01 23:22:26.0,​ id=1,​ create_user=mike,​ product_name=苹果,​ remarks=送货上门,不想下楼,​ status=1,​ version=1767733224539160576])

解决:
从问题可以看到同步数据时出现了问题,没有写入数据,这一般是字段配置的问题,但是如果仅仅只是猜测的话,可能会花费较多的时间,这时候我们可以查看solr服务端日志,了解具体的报错详情

tail -500f /data/solr-8.2.0/server/logs/solr.log

在这里插入图片描述
从上述日志可以看到是因为有一个必填字段labels,但是没有传值进来,导致新增数据失败

修改managed-schema或者schema.xml文件,将该字段设置为非必填即可

在这里插入图片描述
修改完重启solr,再重新同步即可

2. Could not write property file

问题:
solr-admin中查看Logging,发现报错DocBuilder Could not write property file
解决:

1、查看详细的服务日志

tail -500f /data/solr-8.2.0/server/logs/solr.log

在这里插入图片描述

2、通过日志可以看到是FileNotFoundException: /data/solr-8.2.0/server/solr/orders/conf/dataimport.properties

这就非常清晰了,dataimport.properties 文件未找到,我们创建一个即可

mkdir -p /data/solr-8.2.0/server/solr/orders/conf/
touch /data/solr-8.2.0/server/solr/orders/conf/dataimport.properties

3、重启solr即可

5. 总结

mysql同步solr的核心在于配置文件的书写,当发现有错误时,可以通过服务端日志排查具体错误。

但数据同步还未完成,我们目前还没有实现自动的同步,还需要手动点击同步,下一节继续讲解,solr从mysql自动同步数据

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

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

相关文章

chatgpt赋能python:Python中取某个元素的技巧

Python 中取某个元素的技巧 作为一种强大而灵活的编程语言&#xff0c;Python 常常被用来处理各种数据集合&#xff0c;如列表、元组、字典等。在处理这些数据集合的过程中&#xff0c;取某个元素的需求很常见&#xff0c;同时也有多种实现方法。在本文中&#xff0c;我们将介…

python学习-进阶基本知识点总结

&#xff08;一&#xff09;正则表达式 1、正则表达式 字符类 [abc]&#xff1a;匹配 “a”、“b” 或 “c” 中的任意一个字符。abc&#xff1a;除了 “a”、“b” 和 “c” 以外的任何字符。[a-z]&#xff1a;匹配任何小写字母。[A-Z]&#xff1a;匹配任何大写字母。[0-9]&…

第6节:obj/fbx/shp等转3dtiles(免费转换工具+视频)

推介使用cesiumlab 进行转换(可免费转换,含转换结果预览),网上也看了很多转换工具,要么操作安装不方便,要么转换出来效果不理想。 1、下载cesiumlab工具 下载地址 2、启动cesiumlab,进行登录访问(网页版) 没有账号的可以用手机号注册一个 3、 选择通用模型切片 …

恒容容器放气的瞬时流量的计算与合金氢化物放氢流量曲线的计算

有时候&#xff0c;你会遇到一个问题&#xff0c;该问题的描述如下&#xff1a; 你有一个已知体积的容器&#xff0c;设容器体积为V&#xff0c;里面装有一定压力(初始压力)的气体&#xff0c;如空气或氢气等&#xff0c;设初始压力为1MPa&#xff0c;容器出口连接着一个阀门开…

数据库关系操作集合

文章目录 传统集合运算1:联合&#xff08;UNION&#xff09;2:差集&#xff08;EXCEPT 或 MINUS 或 LEFT JOIN&&IS NULL&#xff09;3:交集&#xff08;INTERSECT或INNER JOIN&#xff09;4:笛卡尔积&#xff08;JOIN&#xff09; 专门集合运算1:选择&#xff08;SELEC…

JVM那些事 (含经典面试题)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 前言: 1. JVM&#xff1a;Java 虚拟机&#x…

【MySQL高级篇笔记-性能分析工具的使用 (中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库服务器的优化步骤 二、查看系统性能参数 三、统计SQL的查询成本&#xff1a;last_query_cost 四、定位执行慢的 SQL&#xff1a;慢查询日志 1、开启慢查询日志参数 2、查看慢查询数目 3、慢查询日志分析工具&#xf…

k8s 配置service失败

服务暴露的端口不可用 查看容器的状态是否为Running。 进入容器&#xff0c;然后对容器进行curl。 curl 127.0.0.0:<需要查询的端口>如果是refuse或者其他返回&#xff0c;说明服务完全不可用。 注册service 能够进行外网访问的必须是NodePort类型。NodeIP是无法进…

Java 实现在顺序表指定位置插入一个元素

一、思路 1.定义一个pos变量来记录要插入的位置. 2.定义一个usedSize变量来记录元素个数. 3.定义一个data变量来记录要插入的元素值. 4.要保证pos位置合法&#xff0c;也就是不是负数&#xff0c;因为是要保证pos位置前是要有元素&#xff0c;因此也不能大于元素个数. 5.也需要…

【电子学会】2023年03月图形化二级 -- 电子画板

电子画板 1. 准备工作 (1)删除默认的小猫角色,保留默认白色背景; (2)从角色库添加Arrow1角色作为画笔; (3)绘制五个角色:颜色分别为红、黄、绿、蓝、紫的圆形; (4)将Arrow1角色的第一个造型修改为下图所示状态,箭头尖端在角色中心位置。 2. 功能实现 (1)点…

他山之石可以攻玉:解锁9个chatGPT常用姿势

ChatGPT是一个颠覆性的人工智能&#xff0c;可以用来实现众多目标。下面是我们用中文提出的关于这些任务的指令&#xff0c;以及来自ChatGPT的中文回答示例。 调试代码 提示&#xff1a;为什么我的python代码报错&#xff1a;x [2, 3, 8 9]&#xff1f; ChatGPT回答&#x…

chatgpt赋能python:Python反转输出的利用

Python反转输出的利用 在Python编程中&#xff0c;有时候需要对一些字符串或列表进行反转输出。这种操作非常实用&#xff0c;可以用于字符串或列表翻转、倒序等场景&#xff0c;可以帮助我们提高代码的效率。在本文中&#xff0c;我们将介绍Python反转输出的方法以及实用性。…

2023/06/03 软件PM入门学习(二)

视频参考地址&#xff1a; B站闫波软件项目管理视频学习. 视频资源&#xff1a;video P3 本篇重点&#xff1a;过程、CMMI 简书日更计划同步记录&#x1f3c3;… 杂 项目管理五要素 技术、方法、团队建设、信息、沟通 战略角度 人员&#xff08;people&#xff09;问题 &am…

用Python的turtle和matplotlib画出圆满和爱心

马上就要到六一儿童节了&#xff0c;小朋友很喜欢画画&#xff0c;这里就用Pyhton来画一些简单形状。 首先是圆形&#xff0c;圆形的寓意是圆满、完美、团圆、优胜和团结。圆形在形状上是一个平面中点到定点距离相等的图形&#xff0c;象征着圆满和完美&#xff0c;寓意着无所不…

chatgpt赋能python:用什么软件编写Python文件?

用什么软件编写Python文件&#xff1f; Python 是一种流行的编程语言&#xff0c;许多人使用它来编写软件应用程序、数据分析工具以及自动化脚本。但是对于初学者来说&#xff0c;可能会感到迷茫&#xff0c;不知道应该用什么软件来编写并运行Python文件。本文将介绍几种非常流…

实战Windows Chrome 0day

遇到挑战跟挫折的时侯&#xff0c;我有一个坚定的信念&#xff0c;我可以断气&#xff0c;但绝不能放弃 漏洞复现 实战Windows Chrome 0day需要满足的条件 第一点是关闭沙箱环境 第一种方式 设置Chrome浏览器的快捷方式 在快捷方式上增加 -no-sandbox 第二种方式 命令行命令…

Vue-CLI + Vue3 + Vue-Router4 实现tabbar小案例

Vue-CLI Vue3 Vue-Router4 实现tabbar小案例 tabbar导航栏案例&#xff1a;该案例实现了基础的组件封装&#xff0c;编程式路由&#xff0c;以及插槽的使用&#xff0c;对于我们日常组件化开发有着很大的启示作用&#xff0c;主要效果是点击下方的导航栏链接&#xff0c;上方…

【owt】addon.MediaStream,erizo::MediaStream 还有addon.MediaXXX,erizo::MediaXXX

9. MediaStream 和erizo::MediaStream 类的继承关系 erizo::MediaStream source/agent/webrtc/rtcConn/erizo/src/erizo/MediaStream.h source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h erizo::MediaSource source/agent/webrtc/rtcConn/erizo/src/erizo/…

皮卡丘RCE

1.RCE漏洞描述 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙…