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

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自动同步数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[java安全]反射

文章目录 [java安全]反射定义反射的运用1、反射获取类对象1.1、Class.forName()1.2、Object.class1.3、obj.getClass() 2、反射获取成员方法2.1、getMethods()2.2、getDeclaredMethods()2.3、getMethod()2.4、getDeclaredMethod() 3、反射获取构造方法4、反射创建对象4.1、通过…

自动化测试selenium环境搭建

自动化测试工具selenium搭建 1. 自动化和selenium基本概念 1) 什么是自动化?为什么要做自动化&#xff1f; 自动化测试能够代替一部分的手工测试&#xff0c;自动化测试能够提高测试的效率。随着项目功能的增加&#xff0c;版本越来越多&#xff0c;版本的回归测试的压力也…

MySQL架构简介

MySQL是系统架构中最常见的中间件&#xff0c;主要由Server层&#xff08;连接器Connectors、连接池Connection Pool、查询缓存query cache、分析器Parser、优化器Optimizer、执行器、binlog&#xff09;以及存储引擎层组成。 MySQL架构简介 连接器 与客户端建立连接、认证身…

论文笔记:Graph neural networks: A review of methods and applications

1 GNN的设计pipeline 1.1 获取图结构 结构化场景 图结构在应用问题中是已知的 比如分子结构、物理系统非结构化场景 图结构在应用问题中是未知的 需要根据任务人为地建图 1.2 判断图的类型 & 尺寸 图的类型 有向图/无向图//异构图/同构图 图中的点和边类型是不是一样的…

LearnOpenGL-高级OpenGL-8.高级GLSL

本人初学者&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 文章目录 高级GLSLGLSL的内建变量在顶点着色器的内建变量gl_PointSizegl_VertexID 在片段着色器的内建变量gl_FragCoordgl_FrontFacinggl_FragDepth 接口块Uniform缓冲对象Uniform块布局使用Uniform缓冲简…

基于QT的智能家居中控系统的简明设计

文章目录 系统总体说明主板UI设计后续改进与完善 系统总体说明 系统采用 “主从式架构” &#xff0c;即一主多从式&#xff0c;该智能居家控制系统的主要功能包括登录功能、注册功能、音乐播放功能、时间显示、日历显示、温度湿度光照气压海拔数据等环境指标数据显示等。   …

Linux之理解文件系统——文件的管理

文章目录 前言一、磁盘1.磁盘的物理结构2.磁盘的存储结构3.磁盘的逻辑结构 二、文件系统与inode1.文件在磁盘中是如何存储的&#xff1f;2.对文件进行操作 三、软硬链接1.软链接创建软链接&#xff1a;inode删除软链接&#xff1a;软链接的作用&#xff1a; 2.硬链接创建硬链接…

堆(堆排序 模拟堆)

目录 一、堆的数据结构二、堆的操作方法往下调整的示意图往上调整的示意图相关功能的实现思路1.插入一个数2.求最小值3.删除最小值4.删除任意一个元素5.修改任意一个元素 三、堆的实战运用堆排序模拟堆 一、堆的数据结构 堆是一个完全二叉树&#xff1a;除了最后一层结点以外&…

3ds MAX 基本体建模,长方体、圆柱体和球体

3ds MAX基本页面如下&#xff1a; 生成新的几何体在右侧&#xff1a; 选择生成的对象类型即可&#xff0c;以下为例子&#xff1a; 1、长方体建模 选择建立的对象类型为长方形 在 任意一个窗口绘制&#xff0c;鼠标滑动 这里选择左上角的俯视图 松开鼠标后&#xff0c;可以…

第18章 JQuery DataTables初始化渲染显示与排序

1 System.Linq.AsyncIEnumerableExtensions (Data\Extensions\AsyncIEnumerableExtensions.cs) namespace System.Linq { /// <summary> /// 【异步枚举数扩展--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过对System.Linq.Async中方法的自定义扩展…

C++进阶 —— set

目录 一&#xff0c;set介绍 二&#xff0c;set使用 一&#xff0c;set介绍 set是按照特定次序存储元素的关联式容器&#xff0c;元素不可重复&#xff1b;set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可从容器中插入和删除它们&#xff1b;set中的元素总是按…

【测试报告】个人博客系统自动化测试报告

文章目录 项目背景项目功能测试计划功能测试测试用例执行测试的操作步骤 自动化测试设计的模块、自动化运行的结果、问题定位的结果自动化测试优点 项目背景 对于一个程序员来说&#xff0c;定期整理总结并写博客是不可或缺的步骤&#xff0c;不管是对近期新掌握的技术或者是遇…

代码随想录算法训练营第五十三天 | 力扣 1143.最长公共子序列, 1035.不相交的线, 53. 最大子序和

1143.最长公共子序列 题目 1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符…

SpringBoot——原理(自动配置+原理分析-源码跟踪)

源码跟踪 从Springboot的启动类进入&#xff0c;进行分析. 源码跟踪技巧 在以后接触各种框架的时候&#xff0c;如果需要查看源码&#xff0c;需要找到关键点和核心流程&#xff0c;先在宏观对整个原理和流程有一个认识&#xff0c;之后再去了解其中的细节。 按住Ctrl左键进…

怎么实现常用网络接口自动化测试框架应用?

一、RESTful&#xff08;resource representational state transfer)类型接口测试 (一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

基于物理信息的神经网络(Physics-informed Neural Networks;PINNs)Part-1(简单介绍)

【摘要】 基于物理信息的神经网络&#xff08;Physics-informed Neural Networks&#xff0c;简称PINNs&#xff09;&#xff0c;是一类用于解决有监督学习任务的神经网络&#xff0c;它不仅能够像传统神经网络一样学习到训练数据样本的分布规律&#xff0c;而且能够学习到数学…

UFS 2 -UFS架构简介2

UFS 2 -UFS架构简介2 1 UFS架构简介1.1 System Boot and Enumeration1.2 UFS Interconnect (UIC) Layer1.2.1 UFS Physical Layer Signals1.2.2 MIPI UniPro1.2.3 MIPI UniPro Related Attributes 1.3 UFS Transport Protocol (UTP) Layer1.3.1 Architectural Model1.3.1.1 Cli…

图解max{X,Y}和min{X,Y}并求相关概率

图解max{X,Y}和min{X,Y}并求相关概率 对max{X,Y}或min{X,Y}进行分解再求解 P ( m a x { X , Y } ≥ c ) P [ ( X ≥ c ) ∪ ( Y ≥ c ) ] P ( m a x { X , Y } ≤ c ) P [ ( X ≤ c ) ∩ ( Y ≤ c ) ] P ( m i n { X , Y } ≥ c ) P [ ( X ≥ c ) ∩ ( Y ≥ c ) ] P ( m i…

k8s功能优势应用场景介绍(一)

一&#xff0c;K8S功能: 1、数据卷 pod中容器之间共享数据&#xff0c;可以使用数据卷 2、应用程序健康检查 容器内服务可能进程阻塞无法处理请求&#xff0c;可以设置监控检查策略保证应用健壮性 3、复制应用程序实例 控制器维护着pod副本数量&#xff0c;保证一个pod或一组同…

C++11 auto类型推导

1.类型推导 C11引入了auto 和 decltype 关键字实现类型推导&#xff0c;通过这两个关键字不仅能方便地获取复杂的类型&#xff0c;而且还能简化书写&#xff0c;提高编码效率。 auto 类型推导的语法和规则 在之前的 C 版本中&#xff0c;auto 关键字用来指明变量的存储类型…