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

[超级连接:Linux+Solr+Zookeeper系列-序章]


本章以新闻搜索为例,对Solr开发进行记录,主要涉及以下知识:

  • 如何通过dataimport功能自动的MySql数据库中的数据导入到Solr数据库中。

本文的配置以上一篇文章为基础。


1.背景说明

在上一篇中,讲解了如何手动的MySql数据库中的数据导入到Solr数据库中。

这在实际应用中是不可用的,因为我们不可能每修改一次数据,就跑到后台进行一次手动导入。

本篇主要讲解,如何实现这个过程的自动化。


实现自动化更新的原理:通过Java的Timer定时器。

其实我们可以自己写一个服务,按照一定的时间间隔去调用solr的full-importdelta-import的URL,实现自动更新。

不过,因为已经有人造好了轮子,所以本文是使用前人造好的轮子实现这个目的。

2.配置过程

2.1.拷贝jar包

下载地址:apache-solr-dataimportscheduler-1.0-with-source.jar

将**apache-solr-dataimportscheduler-1.0-with-source.jar**拷贝至solr/server/solr-webapp/webapp/WEB-INF/lib/目录下。

cp apache-solr-dataimportscheduler-1.0-with-source.jar /usr/local/solrcloud/solr1/server/solr-webapp/webapp/WEB-INF/lib/

2.2.添加监听

将**apache-solr-dataimportscheduler-1.0-with-source.jar**包中定义好的监听服务添加到solr的web.xml文件中。

sudo vim /usr/local/solrcloud/solr1/server/solr-webapp/webapp/WEB-INF/web.xml

在web.xml中的第一个servlet标签之前,添加以下内容:

  <listener>
    <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
  </listener>

2.3.添加更新配置文件

下载配置文件:dataimport.properties

dataimport.properties拷贝至solr/server/solr/conf/目录下。

sudo mkdir /usr/local/solrcloud/solr1/server/solr/conf/
sudo cp dataimport.properties /usr/local/solrcloud/solr1/server/solr/conf/dataimport.properties
sudo vim /usr/local/solrcloud/solr1/server/solr/conf/dataimport.properties

修改配置如下:

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1

#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
syncCores=news

#  solr server name or IP address
#  [defaults to localhost if empty]
server=127.0.0.1

#  solr server port
#  [defaults to 80 if empty]
port=8983

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
interval=1

#  重做索引的时间间隔,单位分钟,默认7200,即1天; 
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200

#  重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true

#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=2012-04-11 03:10:00

主要修改项:

  • server:localhost或本机IP
  • port:服务端口号
  • interval:增量更新间隔,单位分钟
  • reBuildIndexInterval=7200:重做索引更新间隔,单位分钟

特别说明:interval为增量更新时间,如果首次上线时需要全局导入的数据量很大,建议将interval修改为7200。然后再部署完成之后,在solr后台通过手动fullimport功能进行全局导入。导入成功之后,回来修改interval=5(建议值),然后重启solr服务。

2.4.修改数据库添加时间戳字段

solr的更新是根据时间戳的比较结果进行的,所以需要在solr相关的数据库表结构中添加时间戳字段。

下面分别对MySql和Oracle的处理方式进行说明。

2.4.1.MySql添加时间戳字段

添加方式

ALTER TABLE news ADD COLUMN `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

更新方式

自动更新无需处理:`ON UPDATE CURRENT_TIMESTAMP`

比较方式(在solr-data-config.xml文件中)

update_time > '${dataimporter.last_index_time}'
2.4.2.Oracle添加时间戳字段

添加方式

alter table news add  update_time timestamp ;

更新方式(触发器)

CREATE OR REPLACE TRIGGER news_update_time
   BEFORE INSERT OR UPDATE ON news
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
   IF updating  THEN
      :NEW.update_time := SYSDATE;
   END IF;
END;
/

比较方式(在solr-data-config.xml文件中)

to_char(update_time,'yyyy-mm-dd hh24:mi:ss') > '${dataimporter.last_index_time}'

2.5.配置solr-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>

其中,

  • dataSource:数据源配置
    • name:数据库连接别名
    • type:数据源类型
  • entity:数据库实体配置
    • dataSource:数据库连接别名
    • name:表名
    • query:全量导入(full-import)的查询语句
    • deltaQuery:增量数据的主键的查询语句
    • deletedPkQuery:删除数据的主键的查询语句
    • deltaImportQuery:增量导入(delta-import)的查询语句
  • field:字段配置
    • column:数据库字段名
    • name:solr字段名

2.6.重启服务

/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

2.7.特殊说明

本次配置,只配置了solr1。solr2和solr3的配置请自行修改。


3.验证自动更新可用

登录到Solr Admin,依照下图进入相应页面:
这里写图片描述
说明:

  1. 下拉选择news集合。
  2. 点击Dataimport菜单。
  3. 选择更新方式为delta-import,即增量更新。
  4. 勾选Auto-Refres Status,进行状态自动刷新。
  5. 展开右侧的Raw Status-Output,查看导入的刷新状态 。
  6. 因为dataimport.properties文件中设置的增量更新时间为1分钟,所以等待2分钟,可以看到增量更新时间自动进行了更新,表明自动更新配置成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值