[超级连接:Linux+Solr+Zookeeper系列-序章]
本章以新闻搜索为例,对Solr开发进行记录,主要涉及以下两方面的知识:
- 如何通过修改配置文件完成Solr的Configsets的配置。
- 如何通过dataimport功能将MySql数据库中的数据导入到Solr数据库中。
1.场景说明
整体目标: 通过Solr Admin后台查询功能,查询出天气预报的相关新闻。
MySql表结构:
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
1.新建配置集:拷贝并重命名Solr内置的基础配置集basic_configs,形成新闻的配置集news_configs。
sudo cp -r /usr/local/solrcloud/solr1/server/solr/configsets/basic_configs/ /usr/local/solrcloud/solr1/server/solr/configsets/news_configs
news_configs配置集包含了新闻集合类型的所有配置文件。
2.新建数据源:在news_configs/conf目录下新增news-data-config.xml文件。
sudo vim /usr/local/solrcloud/solr1/server/solr/configsets/news_configs/conf/news-data-config.xml
在news-data-config.xml中添加以下内容:
<dataConfig>
<dataSource name="news_db" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://130.10.8.100:3306/exam" user="root" password="1qaz@WSX"/>
<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:数据源配置
- 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文件。
sudo vim /usr/local/solrcloud/solr1/server/solr/configsets/news_configs/conf/managed-schema
找到field name="id"
这一段配置,在其下添加如下配置:
<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相关配置上。
sudo vim /usr/local/solrcloud/solr1/server/solr/configsets/news_configs/conf/solrconfig.xml
找到requestHandler name="/select"
所在行代码,在其上添加如下内容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">news-data-config.xmlstr>
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-5.1.46.jar /usr/local/solrcloud/solr1/server/solr-webapp/webapp/WEB-INF/lib/
注意:如果是SolrCloud模式,则每个节点的相应目录都需要拷贝这些jar包。
6.添加数据导入jar包
如果使用Solr Admin的后台dataimport功能,则需要添加相应jar包:
cp /usr/local/solrcloud/solr1/dist/solr-dataimporthandler-6.6.0.jar /usr/local/solrcloud/solr1/server/solr-webapp/webapp/WEB-INF/lib/
cp /usr/local/solrcloud/solr1/dist/solr-dataimporthandler-extras-6.6.0.jar /usr/local/solrcloud/solr1/server/solr-webapp/webapp/WEB-INF/lib/
cp /usr/local/solrcloud/solr2/dist/solr-dataimporthandler-6.6.0.jar /usr/local/solrcloud/solr2/server/solr-webapp/webapp/WEB-INF/lib/
cp /usr/local/solrcloud/solr2/dist/solr-dataimporthandler-extras-6.6.0.jar /usr/local/solrcloud/solr2/server/solr-webapp/webapp/WEB-INF/lib/
cp /usr/local/solrcloud/solr3/dist/solr-dataimporthandler-6.6.0.jar /usr/local/solrcloud/solr3/server/solr-webapp/webapp/WEB-INF/lib/
cp /usr/local/solrcloud/solr3/dist/solr-dataimporthandler-extras-6.6.0.jar /usr/local/solrcloud/solr3/server/solr-webapp/webapp/WEB-INF/lib/
注意:
- 如果是SolrCloud模式,则每个节点的相应目录都需要拷贝这些jar包。
- 其实还有不拷贝jar包的配置方式,这里就不再赘述了。
7.上传配置
通过Solr字段的zookeeper脚本进行上传。
/usr/local/solrcloud/solr1/server/scripts/cloud-scripts/zkcli.sh --cmd upconfig -confdir /usr/local/solrcloud/solr1/server/solr/configsets/news_configs/conf -confname news -z 192.168.71.128:2181,192.168.71.128:2182,192.168.71.128:2183
下面对命令参数进行简单说明:
zkcli.sh
:solr自带的zookeeper上传脚本
--cmd upconfig
:表示这条命令用于 上传配置
-confdir /usr/local/.....
:表示配置目录所在
-collection news
:表示collection的名称
-confname news
:表示配置的配置名
-z192.168.71.128:2181,192.168.71.128:2182,192.168.71.128:2183
:表示zookeeper服务地址
8.重启服务
/usr/local/solrcloud/solr1/bin/solr restart -c -p 8983 -z 192.168.71.128:2181,192.168.71.128:2182,192.168.71.128:2183
9.添加collection
进入Solr Admin后台,点击Collections菜单,进入Collection添加页面:
点击Add Collection按钮,输入配置,点击保存,完成新闻Collection的创建。
下面对collection的配置进行简单说明:
name
:集合名。
config set
:配置集,即前面章节我们上传的news_configs
,我们给它命名为news
。
numShards
:逻辑分片数量。
replicationFactor
:每个逻辑分片的副本数量。
maxShardsPerNode
:每个节点允许的最大逻辑分片数量。
10.查看collection的逻辑架构
点击Solr Admin左侧的Cloud菜单,即可看到我们刚刚添加的news的逻辑架构:
3.数据导入与查询
3.1.全量数据导入
全量数据导入的操作流程:
- 点击Solr Admin左侧的
Collection Selector
,下拉选择news
。
- 点击新展现的子菜单的
DataImport
按钮,进入数据导入页面。
- 选择
Command
模式为full-import,即全量导入。
- 点击
Execute
按钮,开始数据导入。
- 稍等片刻,点击
Refresh Status
按钮,右侧会显示导入结果,结果如下:
从图中可知,我们这次导入了9条记录。
3.2.默认查询
- 点击左侧的
Query
按钮,进入查询页面。
- 点击
Execute Query
按钮,进行默认查询,获得刚才导入的数据,如图所示:
3.3.增量导入
执行SQL语句,对一条数据进行修改:
update news set title='重庆4月14日天气预报' where id='100008';
增量数据导入的操作流程:
- 点击Solr Admin左侧的
Collection Selector
,下拉选择news
。
- 点击子菜单的
DataImport
按钮,进入数据导入页面。
- 选择
Command
模式为delta-import,即增量导入。
- 注意取消勾选Clean选项,即不清除之前的数据。
- 点击
Execute
按钮,开始数据导入。
- 稍等片刻,点击
Refresh Status
按钮,右侧会显示导入结果,结果如下:
3.4.模糊查询
- 点击左侧的
Query
按钮,进入查询页面。
- 在
q
输入域内输入article:干净
。
- 点击
Execute Query
按钮,进行默认查询,获得所有内容中包含“干净”
这个词的新闻,如图所示: