solr的DIH操作同步mysql数据
1.创建MySQL数据
CREATE TABLE `city` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '城市编号',
`province_id` INT(10) UNSIGNED NOT NULL COMMENT '省份编号',
`city_name` VARCHAR(25) NULL DEFAULT NULL COMMENT '城市名称',
`description` VARCHAR(25) NULL DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=7
;
INSERT INTO `city` (`id`, `province_id`, `city_name`, `description`) VALUES (1, 1, '温岭市', 'BYSocket 的家在温岭。');
INSERT INTO `city` (`id`, `province_id`, `city_name`, `description`) VALUES (3, 11, 'hhhhhh', 'sssss');
INSERT INTO `city` (`id`, `province_id`, `city_name`, `description`) VALUES (4, 11, 'hhhhhh', 'sssss');
INSERT INTO `city` (`id`, `province_id`, `city_name`, `description`) VALUES (5, 420100, '武汉', '好');
INSERT INTO `city` (`id`, `province_id`, `city_name`, `description`) VALUES (6, 0, 'wuhan', '好好好');
2. DIH全量从MYSQL数据库导入数据
1)配置/home/solrhome/collection1/conf/solrconfig.xml
vim /home/solrhome/collection1/conf/solrconfig.xml
在<requestHandler name="/select" class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler
<!--增加一个处理dataImport的requestHandler-->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
2)在同目录下添加data-config.xml
vim /home/solrhome/collection1/conf/data-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://10.3.5.21:3306/demo" user="root" password="roottest" batchSize="-1" />
<document name="testDoc">
<entity name="city" pk="id" query="select * from city">
<field column="id" name="id"/>
<field column="province_id" name="province_id"/>
<field column="city_name" name="city_name"/>
<field column="description" name="description"/>
</entity>
</document>
</dataConfig>
说明:
dataSource是数据库数据源。
Entity就是一张表对应的实体,pk是主键,query是查询语句。
Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。
3)修改同目录下的schema.xml,这是Solr对数据库里的数据进行索引的模式
vim /home/solrhome/collection1/conf/schema.xml
<field name="province_id" type="int" indexed="true" stored="true" />
<field name="city_name" type="text_ik" indexed="true" stored="true" />
4)拷贝关联jar
拷贝mysql-connector-java-3.1.13-bin.jar和solr-dataimporthandler-4.10.3.jar(可以在阿里云maven仓库中获取到 http://maven.aliyun.com)
cp /usr/local/solr-4.10.3/dist/solr-dataimporthandler-4.10.3.jar /home/tomcat6/webapps/solr/WEB-INF/lib/
cp /home/test/mysql-connector-java-3.1.13-bin.jar /home/tomcat6/webapps/solr/WEB-INF/lib/
5)重启Solr
如果配置正确就可以启动成功。
solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等。
schema.xml配置映射了各种数据类型的索引方案。分词器的配置、索引文档中包含的字段也在此配置。
6)索引测试
(1)Solr控制台导入
(2)HTTP方式导入
http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=false
7)分批次导入数据
如果数据库数据太大,可以分批次导入数据。
vim /home/solrhome/collection1/conf/data-config.xml
<?xml version="1.0" encoding="UTF-8"?><dataConfig><dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" /><document name="testDoc"><entity name="student" pk="id"query="select * from student limit ${dataimporter.request.length} offset ${dataimporter.request.offset}"><field column="id" name="id"/><field column="stu_name" name="stu_name"/><field column="stu_sex" name="stu_sex"/><field column="stu_address" name="stu_address"/></entity></document></dataConfig>
上面主要是通过内置变量 “${dataimporter.request.length}”和 “${dataimporter.request.offset}”来设置一个批次索引的数据表记录数,请求的URL示例如下:
http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=false&offset=0&length=2
导入效果如下
3.DIH增量从MYSQL数据库导入数据
已经学会了如何全量导入MySQL的数据,全量导入在数据量大的时候代价非常大,一般来说都会适用增量的方式来导入数据,下面介绍如何增量导入MYSQL数据库中的数据,以及如何设置定时来做。
特别注意:DIH增量也是可以做全量数据导入,所以生产环境只要设置DIH增量方式。
1)数据库表的更改
新增一个字段updateTime,类型为timestamp,默认值为CURRENT_TIMESTAMP。有了这样一个字段,Solr才能判断增量导入的时候,哪些数据是新的。因为Solr本身有一个默认值last_index_time,记录最后一次做full import或者是delta import(增量导入)的时间,这个值存储在文件conf目录的dataimport.properties文件中。
more dataimport.properties
2)data-config.xml中必要属性的设置
vim /home/solrhome/collection1/conf/data-config.xml
<?xml version="1.0" encoding="UTF-8"?><dataConfig><dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" /><document name="testDoc"><entity name="student" pk="id"query="select * from student where isDeleted=0"deltaImportQuery="select * from student where id='${dih.delta.id}'"deltaQuery="select id from student where updateTime> '${dataimporter.last_index_time}' and isDeleted=0"deletedPkQuery="select id from student where isDeleted=1"><field column="id" name="id"/><field column="stu_name" name="stu_name"/><field column="stu_sex" name="stu_sex"/><field column="stu_address" name="stu_address"/></entity></document></dataConfig>
transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签
query:查询数据库表符合记录数据
deltaQuery:增量索引查询主键ID 注意这个只能返回ID字段
deltaImportQuery:增量索引查询导入的数据
deletedPkQuery:增量索引删除主键ID查询 注意这个只能返回ID字段
增量索引的原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。
然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。
核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。
如果业务中还有删除操作,可以在数据库中加一个isDeleted字段来表明该条数据是否已经被删除,这时候Solr在更新index的时候,可以根据这个字段来更新哪些已经删除了的记录的索引。
3)测试增量导入
DIH全量导入
http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=true
修改student数据
update student set stu_name="jerry" where id = '1000000005';update student set isDeleted=1 where id = '1000000004';INSERT INTO student VALUES ('1000000006', 'Tim11', 0, 'Paris',default,default);
DIH增量导入数据
http://192.168.137.168:8080/solr/collection1/dataimport?command=delta-import
4)设置增量导入为定时执行的任务
可以用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题。
但是更方便,更加与Solr本身集成度高的是利用其自身的定时增量导入功能。
1.增加关联jar
cp /home/test/apache-solr-dataimportscheduler.jar /home/tomcat6/webapps/solr/WEB-INF/lib/
2、修改solr的WEB-INF目录下面的web.xml文件:
vim /home/tomcat6/webapps/solr/WEB-INF/web.xml
为<web-app>元素添加一个子元素
<listener><listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class></listener>
3、新建配置文件dataimport.properties:
在SOLR_HOME\solr目录下面新建一个目录conf(注意不是SOLR_HOME\solr\collection1下面的conf)
mkdir /home/solrhome/conf
vim /home/solrhome/conf/dataimport.properties
下面是最终我的自动定时更新配置文件内容:
################################################## ## dataimport scheduler properties ## ################################################### to sync or not to sync# 1 - active; anything else - inactivesyncEnabled=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=game,resourcesyncCores=collection1# solr server name or IP address# [defaults to localhost if empty]server=192.168.137.168# solr server port# [defaults to 80 if empty]port=8080# application name/context# [defaults to current ServletContextListener's context (app) name]webapp=solr# URLparams [mandatory]# remainder of URL#http://localhost:8983/solr/collection1/dataimport?command=delta-import&clean=false&commit=trueparams=/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=2# 重做索引的参数reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期reBuildIndexBeginTime=03:10:00
4、测试
重启tomcat
一般来说要在你的项目中引入Solr需要考虑以下几点:
1、数据更新频率:每天数据增量有多大,及时更新还是定时更新
2、数据总量:数据要保存多长时间
3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟
4、数据特点:数据源包括哪些,平均单条记录大小
5、业务特点:有哪些排序要求,检索条件
6、资源复用:已有的硬件配置是怎样的,是否有升级计划
本文转自yushiwh 51CTO博客,原文链接:http://blog.51cto.com/yushiwh/1969344,如需转载请自行联系原作者
solr的DIH操作同步mysql数据相关推荐
- Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑
Elasticsearch集群部署 1.服务器规划 10.4.7.11 node1 10.4.7.12 node2 10.4.7.13 node3 1. 集群相关 一个运行中的 Elastics ...
- 利用Canal全量/增量同步mysql数据至ES
Canal同步mysql数据至ES 1.更改Mysql配置 1.1 开启 Binlog 写入功能 配置 binlog-format 为 ROW 模式,配置my.cnf [mysqld] log-bin ...
- 使用canal实时同步MySQL数据到Elasticsearch
使用canal实时同步MySQL数据到Elasticsearch 搭建环境 安装 elasticsearch 安装 kibana 下载和安装canal 1.下载canal 2.配置MySQL 3.配置 ...
- logstash增量同步mysql数据到es
本篇本章地址:https://www.cnblogs.com/Thehorse/p/11601013.html 今天我们来讲一下logstash同步mysql数据到es 我认为呢,logstash是众 ...
- Flink-cdc 同步mysql数据
下载地址:https://github.com/ververica/flink-cdc-connectors/releases 这里下载2.2.0版本:https://github.com/verve ...
- Logstash同步mysql数据
Logstash同步mysql数据到ElasticSearch 1.安装logstash 下载logstash,解压压缩包 下载地址:https://www.elastic.co/downloads/ ...
- solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
1.创建MySQL数据 create databasesolr;usesolr;DROP TABLE IF EXISTSstudent;CREATE TABLEstudent ( idchar(10) ...
- elasticsearch通过logstash同步mysql数据(中文分词)
Elasticsearch 目录 概述 索引(Index) 类型(Type) 文档(Document) 倒排索引(Inverted Index) 节点(Node) 安装 启动 DSL(查询语句) 官方 ...
- 使用canal同步MySQL数据到Elasticsearch(ES)
目录 1.功能及使用场景 1.1.功能介绍 1.2.使用场景 2.需求引入 3.canal文件下载及准备 3.1 下载文件 3.2 准备文件 4.deployer安装及效果测试 4.1.deploye ...
最新文章
- MYSQL自定义排序
- 时间复杂度与O(1), O(n), O(logn), O(nlogn) 的区别
- php array第一张图片_PHP array_udiff() 函数
- 17张图带你解析红黑树的原理!保证你能看懂!
- jmeter之线程组如何使用
- 嵌入式操作系统内核原理和开发(最快、最优、最差内存分配算法)
- Netty入门(九)空闲连接以及超时
- LeetCode 172 阶乘后的0
- for命令linux,linux命令:for循环(示例代码)
- 关于动态规划的一点学习感想
- xcode 4.5中设置程序名字多语言
- 关于Unicode字符集
- Matlab:绘制正弦曲线与余弦曲线
- shell了解MySQL_MySQLShell:01从入门到蒙圈
- IDEA执行hadoop相关报错xxx from xxx is not a valid DFS filename.
- nmn真的有效果吗,NMN驱动禁食相关的脂肪燃烧
- 原创OI题目:部落冲突
- 数据库配置口令复杂度策略和口令有效期策略
- 卫片图斑_制作和下发卫片执法图斑
- 【Maya】编译USD(个人笔记)