# 1. 场景说明
在正常的使用场景中,我们需要将关系型数据按照对象的形式转换为JSON文档。然后将JSON文档输入全文搜索引擎进行索引。在solr中,我们可以使用DIH(Data Import Handler)实现这个操作。
整体目标: 通过Solr Admin后台查询功能,查询出天气预报的相关新闻。
solr的安装,可以参考macOS M1芯片centos8容器下Solr的安装教程(单机版) (opens new window)这篇文章。
MySql表结构:
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结构:
{
"id":"新闻id",
"title":"新闻标题",
"article":"新闻内容"
}
# 2. 配置新闻的Configsets
# 2.1 新建配置集:
拷贝并重命名Solr内置的基础配置集**_default****,形成新闻的配置集news_configs。**
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文件。
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/news-data-config.xml
在news-data-config.xml中添加以下内容:
<dataConfig>
<!-- dataSource config -->
<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 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文件。
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/managed-schema
**找到*field name="id"*这一段配置,在其下添加如下配置:
<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"/>

对上述配置进行简单讲解:
**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相关配置上。
vim /usr/local/solr-8.11.1/server/solr/configsets/news_configs/conf/solrconfig.xml
找到**requestHandler name="/select"**所在行代码,在其上添加如下内容:
<!--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">

**注意:**如果已有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/**目录下:
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*"
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脚本进行上传。
/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. 重启服务
/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
#把用户信息和ip改成你自己的mysql
mysql -uroot -pVCgiPzWhOf+qNE -hlocalhost
#切换表
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日志目录
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
#解压物料包到/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

下载物料,用新的物料包替换旧的物料包。
# 15. solr运维命令
solr包含一个"bin/solr"的脚本,可以用来启动和停止solr。创建和删除collections;等等。
#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