数据库导入数据

生产环境下我们一般需要从数据库中导入数据。

准备测试数据

建一个solrtest的表

CREATE TABLE `solrtest` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
`age` tinyint(3) DEFAULT NULL COMMENT '年龄',
`description` varchar(1000) DEFAULT NULL COMMENT '介绍',
`createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

导入几条数据

insert  into `solrtest`(`id`,`name`,`age`,`description`,`createTime`,`updateTime`) values 
(1,'张三',21,'大家好,欢迎大家来到这里','2022-09-26 10:23:21','2022-09-26 10:23:24'),
(2,'李四',22,'欢迎欢迎','2022-09-26 10:23:27','2022-09-26 10:23:29'),
(3,'王五',23,'热烈欢迎','2022-09-26 10:23:37','2022-09-26 10:23:39');

配置导入处理器

官方文档上说,数据导入处理器9.0就会移除。这个功能将被合并到第三方插件​​dataimporthandler​​中。

The Data Import Handler is deprecated and will be removed in 9.0.

This functionality is being migrated to a new 3rd party plugin available at ​​https://github.com/rohitbemax/dataimporthandler​​.

See the section ​​Package Manager​​ for information about Solr’s plugin framework.

—— 以上内容摘自官方文档:​​https://solr.apache.org/guide/8_11/uploading-structured-data-store-data-with-the-data-import-handler.html​

在​​solrconfig.xml​​中存在一些​​requestHandler​​,首先检查​​solrconfig.xml​​中是否存在名字为​​dataimport​​的​​requestHandler​​。 通过查询,如果没有发现名字为​​dataimport​​的​​requestHandler​​,则需要手动添加。为了以后便于维护此文件,我们就在requestHandler最后,约为1296行处,添加如下内容:

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

配置数据库导入文件

然后配置​​db-data-config.xml​​文件,下面以​​mysql​​为例,将​​mysql​​的​​jar​​包添加到​​server\solr-webapp\webapp\WEB-INF\lib​​目录或​​server\lib\ext​​目录下,注意先创建对应的表。 其中​​updateTimestamp​​为​​timeStamp​​格式的字段,name字段转换为solr中的dd字段。

~$ cd solr-8.11.2/server/solr/mytest/conf
~$ touch db-data-config.xml
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/test" user="root" password="123" />
<document>
<!-- deltaQuery返回值为id即${dih.delta.id}中的id,这两处名称需要一致 -->
<entity name="test" pk="id"
query="select id,name as dd,age,description,createTime,updateTime from solrtest"
deltaImportQuery="select id,name as dd from solrtest where id='${dih.delta.id}'"
deltaQuery="select id from solrtest where updateTimestamp > STR_TO_DATE('${dih.last_index_time}','%Y-%m-%d %T')">
<!-- name字段转换为solr中的dd字段 -->
<field column="name" name="dd"/>
</entity>
</document>
</dataConfig>
  • query是获取全部数据的SQL
  • deltaImportQuery是获取增量数据时使用的SQL
  • deltaQuery是获取pk的SQL
  • parentDeltaQuery是获取父Entity的pk的SQL
    在conf文件夹下有个dataimport.properties文件,用来记录每个表(entity)索引最后更新的时间。

#Mon Sep 26 12:10:14 CST 2022 test.last_index_time=2022-09-26 12\:10\:13 last_index_time=2022-09-26 12\:10\:13

${dih.last_index_time} 可以在deltaQuery语句中使用,DIH(DataImportHandler)

这里需要注意的是​​tinyint(1)​​类型的字段导入时默认会转换为boolean类型的,这时需要使用mysql的​​convert(columnName,SIGNED)​​函数进行处理,其中第一个参数为需要转换的列,第2个参数为转换成的类型,这里使用​​SIGNED​​意思为整型

添加jar包

把用到的数据库驱动jar包(jdbc,自己准备)放到server/solr-webapp/webapp/WEB-INF/lib目录下,我这里用的是mysql-connector-java-8.0.29.jar

复制jar包

~$ cp solr-8.11.2
~$ cp dist/solr-dataimporthandler-8.11.2.jar server/solr-webapp/webapp/WEB-INF/lib

重启solr,然后就可以导入数据了

导入数据

Solr 8.11入门教程(3)数据库导入数据_solr

执行成功后可以查询到

Solr 8.11入门教程(3)数据库导入数据_mysql_02

可以看到右侧已经有数据了。

参考文档

  1. ​官方文档​