Solr之Mysql数据库全量、增量同步-yellowcong
Solr和数据库进行数据的同步,1、配置solrconfig.xml,2、配置data-config.xml,3.配置数据库(创建表和添加远程访问权限),4.配置schema.xml,5、添加jar包,6.系统时间和mysql时间同步,这样dataimport.properties 记录的更新索引时间和数据库时间一致,才能实现增量更新, date -s “2017-04-14 12:12:00”
1 修改solrconfig.xml
#修改solrconfig.xml 配置文件
/usr/local/solr/solr-4.10.3/example/solr/collection1/conf/solrconfig.xml
#添加如下配置 增加resultHandler配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
修改solrconfig.xml 文件
添加如下配置
2 创建data-config.xml
在solrconfig.xml的同级目录下创建data-config.xml文件,配置数据库连接和Solr与mysql数据的对应关系和查询语句。
a 创建测试数据
使用的是Mysql测试的,我的oracle完犊子了
-- 开启远程访问
GRANT ALL PRIVILEGES ON *.*TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
-- 开启远程访问
GRANT ALL PRIVILEGES ON *.*TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
-- 创建数据库
DROP DATABASE IF EXISTS solr;
CREATE DATABASE solr;
USE solr;
-- 如果存在就删除表
DROP TABLE IF EXISTS common_passage;
-- 创建表
CREATE TABLE common_passage(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
author VARCHAR(32) COMMENT '作者',
title VARCHAR(64) COMMENT '标题',
content TEXT NOT NULL COMMENT '文章内容',
add_date TIMESTAMP COMMENT '添加日期'
);
-- mysql 的日期是一个函数-- 尴尬了
-- select SYSDATE() from DUAL
-- 插入数据
INSERT INTO common_passage VALUES(NULL,'张三','Java','Java是xx',SYSDATE());
INSERT INTO common_passage VALUES(NULL,'李四','Oracle','关系型数据库',SYSDATE());
INSERT INTO common_passage VALUES(NULL,'王五','Mysql','老子也是关系型 数据库',SYSDATE());
INSERT INTO common_passage VALUES(NULL,'赵六','Solr','基于Lucene的搜索引擎',SYSDATE());
b 配置data-config.xml
我这个地方是我的数据库配置,你最好看好自己的数据库配置地址,以及用户名及密码等,${dataimporter.request.id} 这个用来获取传递过来的查询参数,id是变化的,但是dataimporter.request是固定的
deltaImportQuery 是在增量导入的时候调用
deltaQuery 增量导入的时候,先查询满足增量条件的数据,然后,执行deltaImportQuery 的sql,导入数据
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://10.0.7.113/solr" user="root" password="root"/>
<document>
<!-- ${dataimport.request.id}中dataimport,是solrconfig.xml配置的名称-->
<entity name="common_passage" transformer="DateFormatTransformer"
query="SELECT id,author,title,content,add_date FROM common_passage a WHERE a.id >= ${dataimporter.request.id}"
deltaImportQuery="SELECT id,author,title,content,add_date FROM common_passage a WHERE a.id = ${dih.delta.id}"
deltaQuery="SELECT id FROM common_passage where add_date > '${dataimporter.last_index_time}'">
<!--查询的数据和数据库索引意义对应
column 是查询的字段
name 是solr索引对应的字段
-->
<field column="id" name="id"/>
<field column="author" name="author"/>
<field column="title" name="title"/>
<field column="content" name="content"/>
<field column="add_date" name="add_date" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
</entity>
</document>
</dataConfig>
c 配置schema.xml 文件
我们的entity的索引字段,需要在schema.xml文件中配置,有些字段是存在的,不用配置,有些没有,就需要自己配置了。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="author" type="text_general" indexed="true" stored="true"/>
<field name="content" type="text_general" indexed="false" stored="true" multiValued="true"/>
<field name="add_date" type="date" indexed="true" stored="true"/>
3 jar包的导入
拷贝solr-dataimporthandler-4.10.3.jar,solr-dataimporthandler-extras-4.10.3.jar,两个jar包到tomcat的solr的lib目录下
拷贝Mysql驱动,看你的数据库的驱动,根据你自己的驱动来弄
#拷贝solr驱动
cp solr-dataimporthandler-4.10.3.jar /usr/local/solr/apache-tomcat-7.0.62/webapps/solr/WEB-INF/lib/
cp solr-dataimporthandler-extras-4.10.3.jar /usr/local/solr/apache-tomcat-7.0.62/webapps/solr/WEB-INF/lib/
#拷贝Mysql驱动, 直接下载到lib目录
wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar
拷贝到目标目录
导入数据
添加成功后,导入的配置有数据了
导入的方式(Full Import/全部导入, delta import 增量同步)
全量
一次将所有的数据都导入
同步的结果
通过url的方式来同步,而非管控台方式
--直接在浏览器里面,发送get请求
http://192.168.66.100:8080/solr/collection1/dataimport?command=full-import&clean=true&commit=true&wt=json&indent=true&verbose=false&optimize=false&debug=false&id=0
参数 | 物理意义 |
---|---|
command | full-import(全量)/delta-import(增量) |
clean | 是否清空数据 |
commit | 是否提交 |
wt | 返回数据格式 |
indent | 返回的结果是否缩进 |
verbose | 表示你想要得到一些关于中间步骤的信息 |
optimize | optimize操作可以优化查询性能,但是消耗资源多 |
debug | debug模式 |
id | 这个地方的数据是自定义的参数 |
下面是请求返回结果
增量同步
逐渐增加索引的量。需要结合deltaImportQuery,和deltaQuery 两个查询,(这种增量的方式,需要在设计表的时候,添加一个字段,来记录最后更新的时间)
1、deltaQuery 查询出满足增量条件的id
2、deltaImportQuery导入满足条件id的数据
请求结果
http://192.168.66.100:8080/solr/collection1/dataimport?command=delta-import&commit=true&wt=json&indent=true&verbose=false&clean=false&optimize=false&debug=false
请求详细
dataimport.properties
这个文件记录最后导入数据的时间, ${dataimporter.last_index_time}
调用的就是这个配置文件里面的时间
Tomcat的常用
#关闭tomcat
/usr/local/solr/apache-tomcat-7.0.62/bin/shutdown.sh
#开启tomcat
/usr/local/solr/apache-tomcat-7.0.62/bin/startup.sh
#查看启动情况
tail -f -n 100 /usr/local/solr/apache-tomcat-7.0.62/logs/catalina.2017-12-04.log
#查看启动情况
jps
参考文献
http://blog.csdn.net/yuwenruli/article/details/8442815
http://blog.csdn.net/jiangjun0130/article/details/50914338
http://blog.csdn.net/a__java___a/article/details/22688243
http://www.jianshu.com/p/c0b06643a467