Solr使用DataImport功能上传MySQL数据库数据教程

1. 场景说明

在正常的使用场景中,我们需要将关系型数据按照对象的形式转换为JSON文档。然后将JSON文档输入全文搜索引擎进行索引。在solr中,我们可以使用DIH(Data Import Handler)实现这个操作。

整体目标: 通过Solr Admin后台查询功能,查询出天气预报的相关新闻。

solr的安装,可以参考macOS M1芯片centos8容器下Solr的安装教程(单机版)这篇文章。

MySql表结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create database exam;
use exam;

drop table if exists news;
create table `news`(`id` int(5) unsigned not null auto_increment comment '新闻id',`title` varchar(20) not null comment '标题',`article` text comment '新闻内容',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '',`valid` varchar(1) not null default '1' comment '是否有效',primary key(id))engine=InnoDB comment='新闻'auto_increment=100000 default charset=utf8;


insert into news(title,article) values('北京4月1日天气预报','今天天气不好,会下大雨,而且有大风,粉尘严重。');
insert into news(title,article) values('天津4月1日天气预报','今天天气很好,暖风和煦,空气干净。');
insert into news(title,article) values('重庆4月1日天气预报','今天天气一般,空气质量一般,下午阴天。');
insert into news(title,article) values('北京4月2日天气预报','今天天气很好,暖风和煦,空气干净。');
insert into news(title,article) values('天津4月2日天气预报','今天天气一般,空气质量一般,下午阴天。');
insert into news(title,article) values('重庆4月2日天气预报','今天天气不好,会下大雨,而且有大风,粉尘严重。');
insert into news(title,article) values('北京4月3日天气预报','今天天气一般,空气质量一般,下午阴天。');
insert into news(title,article) values('天津4月3日天气预报','今天天气不好,会下大雨,而且有大风,粉尘严重。');
insert into news(title,article) values('重庆4月3日天气预报','今天天气很好,暖风和煦,空气干净。');

select * from news;
select * from news where valid = '1';

注意:

为了实现增量数据导入,一定要在表结构中添加数据修改时间戳的相应字段,例如:update_time。

为了实现逻辑删除数据的增量处理,一定要在表结构中添加能够标识逻辑删除的字段,例如:valid。

Solr Document结构:

1
2
3
4
5
{
"id":"新闻id",
"title":"新闻标题",
"article":"新闻内容"
}

2. 配置新闻的Configsets

2.1 新建配置集:

拷贝并重命名Solr内置的基础配置集_default****,形成新闻的配置集news_configs。

1
2
3
4
cp -rf
/usr/local/solr-8.11.1/server/solr/configsets/_default/
/usr/local/solr-8.11.1/server/solr/config
sets/news_configs

news_configs配置集包含了新闻集合类型的所有配置文件。

2.2 新建数据源:

在news_configs/conf目录下新增news-data-config.xml文件。

1
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/news-data-config.xml

在news-data-config.xml中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dataConfig>
<!-- dataSource config -->
<dataSource name="news_db" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/exam?useUnicode=true&amp;characterEncoding=utf8&
amp;serverTimezone=GMT%2b8" user="root" password="VCgiPzWhOf+qNE"/>
<!-- document config -->
<document>
<!-- entity config -->
<entity dataSource="news_db" name="news"
query="select id,title,article from news where valid = '1'"
deltaQuery="select id from news where update_time > '${dataimporter.last_index_time}'"
deletedPkQuery="select id from news where valid = '0'"
deltaImportQuery="select id,title,article from news where id='${dih.delta.id}'">
<!-- field config -->
<field column="id" name="id"/>
<field column="title" name="title"/>
<field column="article" name="article"/>
</entity>
</document>
</dataConfig>

news-data-config.xml包含了Solr的数据导入dataimport功能的数据源信息,下面对几个重要标签进行简单的说明:

dataSource:数据源配置

name:数据库连接别名

type:数据源类型

entity:数据库实体配置

dataSource:数据库连接别名

name:表名

query:全量导入(full-import)的查询语句

deltaQuery:增量数据的主键的查询语句

deletedPkQuery:删除数据的主键的查询语句

deltaImportQuery:增量导入(delta-import)的查询语句

field:字段配置

column:数据库字段名

name:solr字段名

注意:

可以使用select * from table_name来获取所有字段,而不是每个字段都罗列出来。

如果field配置的column与name相同,可以不必配置此字段。

3. 配置Solr字段:

编辑managed-schema文件。

1
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/managed-schema

**找到*field name=”id”*这一段配置,在其下添加如下配置:

1
2
3
4
5
6
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />


<!-- custom fields -->
<field name="title" type="string" indexed="true" stored="true"/>
<field name="article" type="text_general" indexed="true" stored="true"/>

image-20220325161022419

对上述配置进行简单讲解:

name=”title”:name属性即Solr的字段名,一定要与news-data-config.xml的相关配置一一对应。

type=”string”:type属性即字段类型,其中string类型的字段为精确检索,text_general类型的字段为solr自带的分词检索。

**indexed=”true”**:标识此字段可以被搜索。

stored=”true”:标识可以在搜索结果中看到此结果。

4. 加载数据源:

修改solrconfig.xml文件,将news-data-config.xml加载到dataimport相关配置上。

1
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/solrconfig.xml 

找到**requestHandler name=”/select”**所在行代码,在其上添加如下内容:

1
2
3
4
5
6
7
8
9
<!--data import from mysql config -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">news-data-config.xml</str>
</lst>
</requestHandler>


<requestHandler name="/select" class="solr.SearchHandler">

image-20220325161102322

注意:如果已有requestHandler name=”/dataimport”**的相关配置,则不用再添加。只是需要注意将news-data-config.xml添加到配置中即可。

5. 添加数据驱动jar包

下载MySql的驱动jar包:

https://dev.mysql.com/downloads/connector/j/

解压并拷贝jar包至**solr/server/solr-webapp/webapp/WEB-INF/lib/**目录下:

1
cp mysql-connector-java-8.0.11.jar /usr/local/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/

注意:如果是SolrCloud模式,则每个节点的相应目录都需要拷贝这些jar包。

6. 添加数据导入jar包

如果使用Solr Admin的后台dataimport功能,则需要添加相应jar包:

通过find命令,找到对应包的路径。

find / -name “*solr-dataimporthandler*“

1
2
3
4
5
6
cp /usr/local/solr-8.11.1/dist/solr-dataimporthandler-8.11.1.jar /usr/local/solr-8.11.1/server/solr-webapp/we
bapp/WEB-INF/lib/


cp /usr/local/solr-8.11.1/dist/solr-dataimporthandler-extras-8.11.1.jar /usr/local/solr-8.11.1/server/solr-we
bapp/webapp/WEB-INF/lib/

注意:

如果是SolrCloud模式,则每个节点的相应目录都需要拷贝这些jar包。

7. 上传配置

通过Solr字段的zookeeper脚本进行上传。

1
/usr/local/solr-8.11.1/server/scripts/cloud-scripts/zkcli.sh --cmd upconfig -confdir /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/ -confname news -zlocalhost:2181        

下面对命令参数进行简单说明:

zkcli.sh:solr自带的zookeeper上传脚本

–cmd upconfig:表示这条命令用于 上传配置

-confdir /data/wecitydmmid/solr**/…..:表示配置目录所在

-confname news:表示配置的配置名

-zlocalhost:2181:表示zookeeper服务地址

8. 重启服务

1
/usr/local/solr-8.11.1/bin/solr restart -c -force

9. 添加collection

进入Solr Admin后台,点击Collections菜单,进入Collection添加页面:

image-20220325154711442

点击Add Collection按钮,输入配置,点击保存,完成新闻Collection的创建。

image-20220325154745184

下面对collection的配置进行简单说明:

name:集合名。

config set:配置集,即前面我们上传的news_configs,我们给它命名为news。

numShards:逻辑分片数量。

replicationFactor:每个逻辑分片的副本数量。

10. 查看collection的逻辑架构

点击Solr Admin左侧的Cloud菜单,即可看到我们刚刚添加的news的逻辑架构:

image-20220325154839418

11. 数据导入与查询

11.1.全量数据导入

全量数据导入的操作流程:

点击Solr Admin左侧的Collection Selector,下拉选择news。

点击新展现的子菜单的DataImport按钮,进入数据导入页面。

选择Command模式为full-import,即全量导入。

点击Execute按钮,开始数据导入。

稍等片刻,点击Refresh Status按钮,右侧会显示导入结果,结果如下:

image-20220329154518890

从图中可知,我们这次导入了9条记录。

11.2.默认查询

点击左侧的Query按钮,进入查询页面。

点击Execute Query按钮,进行默认查询,获得刚才导入的数据,如图所示:

image-20220329154548550

11.3.增量导入

登陆mysql

1
2
#把用户信息和ip改成你自己的mysql
mysql -uroot -pVCgiPzWhOf+qNE -hlocalhost
1
2
3
4
#切换表
use exam;
#执行SQL语句,对一条数据进行修改:
update news set title='重庆4月14日天气预报' where id='100008';

增量数据导入的操作流程:

点击Solr Admin左侧的Collection Selector,下拉选择news。

点击子菜单的DataImport按钮,进入数据导入页面。

选择Command模式为delta-import,即增量导入。

注意取消勾选Clean选项,即不清除之前的数据。

点击Execute按钮,开始数据导入。

稍等片刻,点击Refresh Status按钮,右侧会显示导入结果,结果如下:

image-20220329154626295

11.4.模糊查询

点击左侧的Query按钮,进入查询页面。

在q输入域内输入article:干净。

点击Execute Query按钮,进行默认查询,获得所有内容中包含“干净”这个词的新闻

12. solr日志目录

1
tail -300 /usr/local/solr-8.11.1/server/logs/solr-8983-console.log

13. 问题汇总****:

问题描述:数据库链接报错

问题详情:

Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

解决方案:

注释掉SSL3配置文件($JAVA_HOME/jre/lib/security/java.security)

编辑该文件注释掉红框部分SSLv3,TLSv1,TLSv1.1

image-20220329154657662

14. 简化流程,solr 8.11 版本物料改造

数据驱动包下载地址

https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#解压物料包到/usr/local/目录
tar -xzf /usr/local/material/solr-8.11.1.tgz -C /usr/local/

#进入需要导入jar包的目录
cd /usr/local/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/

#添加数据驱动和数据导入jar包
cp -rf /usr/local/solr-8.11.1/dist/solr-dataimporthandler-extras-8.11.1.jar ./

#下载jar包
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar

#重新打包物料
cd /usr/local/
#把solr-8.11.1/ 打包成solr-8.11.1.tgz
tar -zcvf solr-8.11.1.tgz solr-8.11.1

image-20220325155503716

下载物料,用新的物料包替换旧的物料包。

15. solr运维命令

solr包含一个”bin/solr”的脚本,可以用来启动和停止solr。创建和删除collections;等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#solr安装路径,具体以你自己安装的为准
/usr/local1/solr-8.11.1/
#启动命令
bin/solr start [options]
bin/solr start -help
#重启命令
bin/solr restart [options]
bin/solr restart -help
#停止命令
bin/solr restart [options]
bin/solr restart -help
#查看版本
bin/solr version
#查看状态
bin/solr status
#健康检查
bin/solr healthcheck [options]
bin/solr healthcheck -help
#创建collection和core
bin/solr create [options]
bin/solr create -help
#删除collection和core
bin/solr delete [options]
bin/solr delete -help
#zookeeper相关操作
bin/solr zk [sub-command] [options]
bin/solr zk -help

16. solr官方教程

https://solr.apache.org/guide/8_11/solr-control-script-reference.html