yelllowcong的专栏

厚积薄发,笨鸟先飞

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

阅读更多
版权声明:本文为博主yellowcong原创文章,未经博主允许不得转载。 https://blog.csdn.net/yelllowcong/article/details/78710581
文章标签: solr
个人分类: 搜索引擎
所属专栏: 搜索引擎
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭