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(200) DEFAULT NULL,

updateTime timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

isDeleted int(1) DEFAULT 0,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES ('1000000001', '李莉', 0, '上海市中山路',default,default);

INSERT INTO student VALUES ('1000000002', 'Tom', 1, 'NewYork',default,default);

INSERT INTO student VALUES ('1000000003', '張小貝', 0, '江西省泰和縣中山路',default,default);

INSERT INTO student VALUES ('1000000004', '鮑勃', 1, '北京市海淀區知春路',default,default);

INSERT INTO student VALUES ('1000000005', 'Tim', 0, 'Paris',default,default);

select * from student;

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

<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://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" />

<document name="testDoc">

<entity name="student" pk="id"

query="select * from student">

<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>

說明:

dataSource是數據庫數據源。

Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。

Field對應一個字段,column是數據庫里的column名,后面的name屬性對應着Solr的Filed的名字。

3修改同目錄下的schema.xml,這是Solr對數據庫里的數據進行索引的模式

vim /home/solrhome/collection1/conf/schema.xml

 

<field name="stu_name" type="text_ik" indexed="true" stored="true" multiValued="false" /> 

<field name="stu_sex" type="int" indexed="true" stored="true" multiValued="false" /> 

<field name="stu_address" type="text_ik" indexed="true" stored="true" multiValued="false" />

4)拷貝關聯jar

拷貝mysql-connector-java-3.1.13-bin.jar和solr-dataimporthandler-4.10.3.jar

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控制台導入

001

002

 

(2)HTTP方式導入

http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=false

003

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

004

導入效果如下

clip_image010

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

clip_image012

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

005

clip_image016

修改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

006

clip_image020

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、資源復用:已有的硬件配置是怎樣的,是否有升級計划

參考http://www.cnblogs.com/luxiaoxun/p/4442770.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM