[超级连接:Linux+Solr+Zookeeper系列-序章]
本章以新闻搜索为例,对Solr开发进行记录,主要涉及以下知识:
- 如何通过dataimport功能自动的将MySql数据库中的数据导入到Solr数据库中。
本文的配置以上一篇文章为基础。
1.背景说明
在上一篇中,讲解了如何手动的将MySql数据库中的数据导入到Solr数据库中。
这在实际应用中是不可用的,因为我们不可能每修改一次数据,就跑到后台进行一次手动导入。
本篇主要讲解,如何实现这个过程的自动化。
实现自动化更新的原理:通过Java的Timer定时器。
其实我们可以自己写一个服务,按照一定的时间间隔去调用solr的full-import
和delta-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,依照下图进入相应页面:
说明:
- 下拉选择
news
集合。 - 点击
Dataimport
菜单。 - 选择更新方式为
delta-import
,即增量更新。 - 勾选
Auto-Refres Status
,进行状态自动刷新。 - 展开右侧的
Raw Status-Output
,查看导入的刷新状态 。 - 因为
dataimport.properties
文件中设置的增量更新时间为1分钟,所以等待2分钟,可以看到增量更新时间自动进行了更新,表明自动更新配置成功。