Linux+Solr+Zookeeper-05:通过DataImport功能手动导入MySql的数据至Solr数据库

[超级连接: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 config -->
        <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 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配置的columnname相同,可以不必配置此字段。

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" />

<!-- 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相关配置上。

sudo vim /usr/local/solrcloud/solr1/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-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按钮,进行默认查询,获得所有内容中包含“干净”这个词的新闻,如图所示:
    这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值