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

2data-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 - 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=game,resource

syncCores=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=true

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=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、资源复用:已有的硬件配置是怎样的,是否有升级计划









时间: 2024-10-26 08:48:51

solr的DIH操作同步mysql数据的相关文章

solr5.5.4 增量索引 自动同步mysql数据

前言:之前测试了solr好几个版本都没有成功,solr比较好下载的版本5.0,5.5,6.6.solr6.6结合tomcat8做自动同步mysql数据一直报错,然后果断测试5.5版本的,成功了. 环境:windows10, jdk1.8,tomcat8,solr5.5.4 实现功能:通过前端输入关键字查询,同时查询多表多字段.当数据库mysql添加或者更新数据的时候,数据自动更新到solr引擎中. 正文: 第一步:下载solr 1.solr5.5下载:http://apache.fayea.co

logstash增量同步mysql数据到es

本篇本章地址:https://www.cnblogs.com/Thehorse/p/11601013.html 今天我们来讲一下logstash同步mysql数据到es 我认为呢,logstash是众多同步mysql数据到es的插件中,最稳定并且最容易配置的一个. input { stdin { } jdbc { type => "xxx" jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/yinhela

logstash同步mysql数据到Elasticsearch

安装logstash查看我的另一篇文章  Docker 部署 logstash 同步数据我们首先需要安装好对应的插件,然后下载对应的数据库链接jar包,下面是具体的步骤 1.进入容器中 docker exec it logstash bash 2.进入到bin 目录下,我这里是/usr/share/logstash/bin,可以看到logstash-plugin文件,然后安装插件 logstash-plugin install logstash-input-jdbc 3.看到如下输出,则表示安装

10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建MySQL数据 create database solr; use solr; DROP TABLE IF EXISTS student; CREATE TABLE student ( id char(10) NOT NULL, stu_name varchar(50) DEFAULT NULL, stu_sex int(1) DEFAULT NULL, stu_address varchar(20

【记录】ELK之logstash同步mysql数据到Elasticsearch ,配置文件详解

本文出处:https://my.oschina.net/xiaowangqiongyou/blog/1812708#comments 截取部分内容以便学习 input { jdbc { # mysql相关jdbc配置 jdbc_connection_string => "jdbc:mysql://10.112.76.30:3306/jack_test?useUnicode=true&characterEncoding=utf-8&useSSL=false" jdb

sqoop同步mysql数据到hive中

一.sqoop 在同步mysql表结构到hive sqoop create-hive-table --connect jdbc:mysql://ip:3306/sampledata --table t1--username dev --password 1234 --hive-table t1; 执行到这一步就退出了,但是在hadoop的hdfs上的/hive/warehouse/的目录下是找不到t1表的目录, 但是正常执行完成是下面这样的: 错误就是hive的jar包有缺失 全部的jar包该是

Elasticsearch-jdbc批量同步mysql数据失败

最近公司系统中全模糊查询很多,数据量又大,多表连接查询时会很影响性能.于是考虑使用搜索引擎来做全模糊查询,思路: mysql数据库数据同步至ES类型,同步采用全量同步+定时增量方式,应用直接从ES中去查询想要的结果. 通过一番查找,决定使用elasticsearch-jdbc进行数据的同步,五六张表的连接结果,在数据量小的开发与测试环境运行正常,但在数据量比较大的性能测试环境做数据同步的话就会出现问题,以下为同步时报的一些错,github上也未找到相关有用的东西.群里问也都没人这样使用. 一种报

elasticsearch使用river同步mysql数据

====== mysql的river介绍======      - 什么是river?river代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法.它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的.这里主要研究针对mysql的river.      - mysql的river插件:mysql的river安装见https://github.com/

[jjzhu学java]之solr4.9同步mysql数据

Solr是一个高性能,採用Java5开发,基于Lucene的全文搜索server.同一时候对其进行了扩展,提供了比Lucene更为丰富的查询语言,同一时候实现了可配置.可扩展并对查询性能进行了优化,而且提供了一个完好的功能管理界面,是一款很优秀的全文搜索引擎. 能够将数据库中的数据导入到solr中,对于百万级别的数据能够高速响应查询. 1.安装jdk JDK版本号须要1.7以上 2.安装solr 下载solr压缩包,解压安装包.进入到SOLR_HOME\example文件夹下,执行命令java