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 name="news_db" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8& amp;serverTimezone=GMT%2b8" user="root" password="VCgiPzWhOf+qNE"/> <document> <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 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" />
<field name="title" type="string" indexed="true" stored="true"/> <field name="article" type="text_general" indexed="true" stored="true"/>
|
对上述配置进行简单讲解:
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
| <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">
|
注意:如果已有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添加页面:
点击Add Collection按钮,输入配置,点击保存,完成新闻Collection的创建。
下面对collection的配置进行简单说明:
name:集合名。
config set:配置集,即前面我们上传的news_configs,我们给它命名为news。
numShards:逻辑分片数量。
replicationFactor:每个逻辑分片的副本数量。
10. 查看collection的逻辑架构
点击Solr Admin左侧的Cloud菜单,即可看到我们刚刚添加的news的逻辑架构:
11. 数据导入与查询
11.1.全量数据导入
全量数据导入的操作流程:
点击Solr Admin左侧的Collection Selector,下拉选择news。
点击新展现的子菜单的DataImport按钮,进入数据导入页面。
选择Command模式为full-import,即全量导入。
点击Execute按钮,开始数据导入。
稍等片刻,点击Refresh Status按钮,右侧会显示导入结果,结果如下:
从图中可知,我们这次导入了9条记录。
11.2.默认查询
点击左侧的Query按钮,进入查询页面。
点击Execute Query按钮,进行默认查询,获得刚才导入的数据,如图所示:
11.3.增量导入
登陆mysql
1 2
| 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按钮,右侧会显示导入结果,结果如下:
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
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
| tar -xzf /usr/local/material/solr-8.11.1.tgz -C /usr/local/
cd /usr/local/solr-8.11.1/server/solr-webapp/webapp/WEB-INF/lib/
cp -rf /usr/local/solr-8.11.1/dist/solr-dataimporthandler-extras-8.11.1.jar ./
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar
cd /usr/local/
tar -zcvf solr-8.11.1.tgz solr-8.11.1
|
下载物料,用新的物料包替换旧的物料包。
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
| /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
bin/solr create [options] bin/solr create -help
bin/solr delete [options] bin/solr delete -help
bin/solr zk [sub-command] [options] bin/solr zk -help
|
16. solr官方教程
https://solr.apache.org/guide/8_11/solr-control-script-reference.html