您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何使用Solr索引MySQL數(shù)據(jù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用Solr索引MySQL數(shù)據(jù)”吧!
這里使用的是mysql測(cè)試。
1、先在mysql中建一個(gè)表:solr_test
2、插入幾條測(cè)試數(shù)據(jù):
3、用記事本打solrconfig.xml文件,在solrhome文件夾中。E:\solrhome\mycore\conf\solrconfig.xml
(solrhome文件夾是什么,參見:http://www.cnblogs.com/HD/p/3977799.html)
加入這個(gè)節(jié)點(diǎn):
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
4、新建一個(gè)data-config.xml文件,與solrconfig.xml同一個(gè)目錄下。內(nèi)容為
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password="root" /> <document> <entity name="solr_test" transformer="DateFormatTransformer" query="SELECT id, subject, content, last_update_time FROM solr_test WHERE id >= ${dataimporter.request.id}"> <field column='last_update_time' dateTimeFormat='yyyy-MM-dd HH:mm:ss' /> </entity> </document></dataConfig>
說明:這里使用了一個(gè)${dataimporter.request.id},這個(gè)是參數(shù),后面在做數(shù)據(jù)導(dǎo)入時(shí),會(huì)使用到,以此條件為基準(zhǔn)讀數(shù)據(jù)。
5、復(fù)制解壓出的solr jar包solr-dataimporthandler-4.10.0.jar和solr-dataimporthandler-extras-4.10.0.jar到tomcat solr webapp的WEB-INF\lib目錄下。
當(dāng)然,也包括mysql的jdbc jar包:mysql-connector-java-5.1.7-bin.jar
(還有一種方法是在solrconfig.xml中加入lib節(jié)點(diǎn),然后把jar包放到solrhome下,這樣可以不在WEB-INF\lib中加入jar包)
6、用記事本打開schema.xml,在在solrhome文件夾中(同第3點(diǎn))。內(nèi)容為:
<?xml version="1.0" ?><schema name="my core" version="1.1"> <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="text_cn" class="solr.TextField"> <analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer" /> <analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer" /> </fieldType> <!-- general --> <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/> <field name="subject" type="text_cn" indexed="true" stored="true" /> <field name="content" type="text_cn" indexed="true" stored="true" /> <field name="last_update_time" type="date" indexed="true" stored="true" /> <field name="_version_" type="long" indexed="true" stored="true"/> <!-- field to use to determine and enforce document uniqueness. --> <uniqueKey>id</uniqueKey> <!-- field for the QueryParser to use when an explicit fieldname is absent --> <defaultSearchField>subject</defaultSearchField> <!-- SolrQueryParser configuration: defaultOperator="AND|OR" --> <solrQueryParser defaultOperator="OR"/></schema>
7、更新zookeeper集群配置
solrctl instancedir --update collection1 /opt/cloudera/parcels/CDH/lib/solr/solr_configs
8、collection1加載新配置信息
http://localhost:8983/solr/admin/collections?action=RELOAD&name=collection1
9、打開solr web:
說明:
Custom Parameters填入id=1,這是在第4點(diǎn)中設(shè)置的參數(shù)。
Clean選項(xiàng),是指是否刪除未匹配到的數(shù)據(jù)。也就是在數(shù)據(jù)庫select結(jié)果中沒有,而solr索引庫中存在,則刪除。
也可以使用這個(gè)地址直接訪問:
http://localhost:8899/solr/mycore/dataimport?command=full-import&clean=true&commit=true&wt=json&indent=true&entity=solr_test&verbose=false&optimize=false&debug=false&id=1
將返回結(jié)果:
配置好后,之后我們只需要使用這個(gè)url地址,就可以不段的去導(dǎo)入數(shù)據(jù)做索引了。(就這么簡(jiǎn)單)
10、測(cè)試查詢:
當(dāng)然,dataimport可以加入?yún)?shù)命令,讓其重新加載data-config.xml
http://localhost:8899/solr/#/mycore/dataimport/command=reload-config
如果在數(shù)據(jù)庫中添加一條數(shù)據(jù),但是Solr索引中沒有index這條數(shù)據(jù),就查不到,所以一般在使用Solr檢索數(shù)據(jù)庫里的內(nèi)容時(shí),都是先插入數(shù)據(jù)庫,再在Solr中index這條數(shù)據(jù),使用Solr的模糊查詢或是分詞功能來檢索數(shù)據(jù)庫里的內(nèi)容。
DIH增量從MYSQL數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)
已經(jīng)學(xué)會(huì)了如何全量導(dǎo)入MySQL的數(shù)據(jù),全量導(dǎo)入在數(shù)據(jù)量大的時(shí)候代價(jià)非常大,一般來說都會(huì)適用增量的方式來導(dǎo)入數(shù)據(jù),下面介紹如何增量導(dǎo)入MYSQL數(shù)據(jù)庫中的數(shù)據(jù),以及如何設(shè)置定時(shí)來做。
1)數(shù)據(jù)庫表的更改
前面已經(jīng)創(chuàng)建好了一個(gè)User的表,這里為了能夠進(jìn)行增量導(dǎo)入,需要新增一個(gè)字段updateTime,類型為timestamp,默認(rèn)值為CURRENT_TIMESTAMP。
有了這樣一個(gè)字段,Solr才能判斷增量導(dǎo)入的時(shí)候,哪些數(shù)據(jù)是新的。
因?yàn)镾olr本身有一個(gè)默認(rèn)值last_index_time,記錄最后一次做full import或者是delta import(增量導(dǎo)入)的時(shí)間,這個(gè)值存儲(chǔ)在文件conf目錄的dataimport.properties文件中。
2)data-config.xml中必要屬性的設(shè)置
transformer 格式轉(zhuǎn)化:HTMLStripTransformer 索引中忽略HTML標(biāo)簽
query:查詢數(shù)據(jù)庫表符合記錄數(shù)據(jù)
deltaQuery:增量索引查詢主鍵ID 注意這個(gè)只能返回ID字段
deltaImportQuery:增量索引查詢導(dǎo)入的數(shù)據(jù)
deletedPkQuery:增量索引刪除主鍵ID查詢 注意這個(gè)只能返回ID字段
有關(guān)“query”,“deltaImportQuery”, “deltaQuery”的解釋,引用官網(wǎng)說明,如下所示:
The query gives the data needed to populate fields of the Solr document in full-import
The deltaImportQuery gives the data needed to populate fields when running a delta-import
The deltaQuery gives the primary keys of the current entity which have changes since the last index time
如果需要關(guān)聯(lián)子表查詢,可能需要用到parentDeltaQuery
The parentDeltaQuery uses the changed rows of the current table (fetched with deltaQuery) to give the changed rows in theparent table. This is necessary because whenever a row in the child table changes, we need to re-generate the document which has that field.
更多說明看DeltaImportHandler的說明文檔。
針對(duì)User表,data-config.xml文件的配置內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?><dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mybatis" user="root" password="luxx" batchSize="-1" /> <document name="testDoc"> <entity name="user" pk="id" query="select * from user" deltaImportQuery="select * from user where id='${dih.delta.id}'" deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}'"> <field column="id" name="id"/> <field column="userName" name="userName"/> <field column="userAge" name="userAge"/> <field column="userAddress" name="userAddress"/><field column="updateTime" name="updateTime"/> </entity> </document></dataConfig>
增量索引的原理是從數(shù)據(jù)庫中根據(jù)deltaQuery指定的SQL語句查詢出所有需要增量導(dǎo)入的數(shù)據(jù)的ID號(hào)。
然后根據(jù)deltaImportQuery指定的SQL語句返回所有這些ID的數(shù)據(jù),即為這次增量導(dǎo)入所要處理的數(shù)據(jù)。
核心思想是:通過內(nèi)置變量“${dih.delta.id}”和 “${dataimporter.last_index_time}”來記錄本次要索引的id和最近一次索引的時(shí)間。
注意:剛新加上的updateTime字段也要在field屬性中配置,同時(shí)也要在schema.xml文件中配置:
<field name="updateTime" type="date" indexed="true" stored="true" />
如果業(yè)務(wù)中還有刪除操作,可以在數(shù)據(jù)庫中加一個(gè)isDeleted字段來表明該條數(shù)據(jù)是否已經(jīng)被刪除,這時(shí)候Solr在更新index的時(shí)候,可以根據(jù)這個(gè)字段來更新哪些已經(jīng)刪除了的記錄的索引。
這時(shí)候需要在dataConfig.xml中添加:
query="select * from user where isDeleted=0" deltaImportQuery="select * from user where id='${dih.delta.id}'" deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}' and isDeleted=0" deletedPkQuery="select id from user where isDeleted=1"
這時(shí)候Solr進(jìn)行增量索引的時(shí)候,就會(huì)刪除數(shù)據(jù)庫中isDeleted=1的數(shù)據(jù)的索引。
測(cè)試增量導(dǎo)入
如果User表里有數(shù)據(jù),可以先清空以前的測(cè)試數(shù)據(jù)(因?yàn)榧拥膗pdateTime沒有值),用我的Mybatis測(cè)試程序添加一個(gè)User,數(shù)據(jù) 庫會(huì)以當(dāng)前時(shí)間賦值給該字段。在Solr中使用Query查詢所有沒有查詢到該值,使用dataimport?command=delta-import 增量導(dǎo)入,再次查詢所有就可以查詢到剛剛插入到MySQL的值。
設(shè)置增量導(dǎo)入為定時(shí)執(zhí)行的任務(wù)
可以用Windows計(jì)劃任務(wù),或者Linux的Cron來定期訪問增量導(dǎo)入的連接來完成定時(shí)增量導(dǎo)入的功能,這其實(shí)也是可以的,而且應(yīng)該沒什么問題。
但是更方便,更加與Solr本身集成度高的是利用其自身的定時(shí)增量導(dǎo)入功能。
1、下載apache-solr-dataimportscheduler-1.0.jar放到\solr-webapp\webapp\WEB-INF\lib目錄下:
下載地址:http://code.google.com/p/solr-dataimport-scheduler/downloads/list
也可以到百度云盤下載:http://pan.baidu.com/s/1dDw0MRn
注意:apache-solr-dataimportscheduler-1.0.jar有bug,參考:http://www.denghuafeng.com/post-242.html
2、修改solr的WEB-INF目錄下面的web.xml文件:
為<web-app>元素添加一個(gè)子元素
<listener> <listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class> </listener>
3、新建配置文件dataimport.properties:
在SOLR_HOME\solr目錄下面新建一個(gè)目錄conf(注意不是SOLR_HOME\solr\collection1下面的conf), 然后用解壓文件打開apache-solr-dataimportscheduler-1.0.jar文件,將里面的 dataimport.properties文件拷貝過來,進(jìn)行修改,下面是最終我的自動(dòng)定時(shí)更新配置文件內(nèi)容:
################################################# # # # 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=localhost # solr server port # [defaults to 80 if empty] port=8983 # 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 # 重做索引的時(shí)間間隔,單位分鐘,默認(rèn)7200,即1天; # 為空,為0,或者注釋掉:表示永不重做索引 # reBuildIndexInterval=2 # 重做索引的參數(shù) reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true # 重做索引時(shí)間間隔的計(jì)時(shí)開始時(shí)間,第一次真正執(zhí)行的時(shí)間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000; # 兩種格式:2012-04-11 03:10:00 或者 03:10:00,后一種會(huì)自動(dòng)補(bǔ)全日期部分為服務(wù)啟動(dòng)時(shí)的日期 reBuildIndexBeginTime=03:10:00
這里為了做測(cè)試每1分鐘就進(jìn)行一次增量索引,同時(shí)disable了full-import全量索引。
4、測(cè)試
在數(shù)據(jù)庫中插入一條數(shù)據(jù),在Solr Query中查詢,剛開始查不到,Solr進(jìn)行一次增量索引后就可以查詢到了。
一般來說要在你的項(xiàng)目中引入Solr需要考慮以下幾點(diǎn):
1、數(shù)據(jù)更新頻率:每天數(shù)據(jù)增量有多大,及時(shí)更新還是定時(shí)更新
2、數(shù)據(jù)總量:數(shù)據(jù)要保存多長(zhǎng)時(shí)間
3、一致性要求:期望多長(zhǎng)時(shí)間內(nèi)看到更新的數(shù)據(jù),最長(zhǎng)允許多長(zhǎng)時(shí)間延遲
4、數(shù)據(jù)特點(diǎn):數(shù)據(jù)源包括哪些,平均單條記錄大小
5、業(yè)務(wù)特點(diǎn):有哪些排序要求,檢索條件
6、資源復(fù)用:已有的硬件配置是怎樣的,是否有升級(jí)計(jì)劃
到此,相信大家對(duì)“如何使用Solr索引MySQL數(shù)據(jù)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。