您好,登錄后才能下訂單哦!
本文主要給大家介紹mysql導入數據到solr的方法,其所涉及的東西,從理論知識來獲悉,有很多書籍、文獻可供大家參考,從現實意義來講,億速云累計多年的實踐經驗可分享給大家。
方式一:創建項目,查詢出數據,一條一條add到solr中;(不推薦)
方式二:通過配置復制數據到solr中
以上已完成了在本地window8中對solr的部署,為solr添加了一個自定義的coredemo,并且引入了ik分詞器。
那么該如何將本地的mysql的數據導入到solr中呢?
mysql數據源:test庫中的user表(7條數據),其中這個update_time字段是用于solr更新數據庫數據的依據,表中必須得有這個字段。
SETFOREIGN_KEY_CHECKS=0;
------------------------------
-- Table structurefor user
------------------------------
DROP TABLE IFEXISTS `user`;
CREATE TABLE`user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`sex` int(1) DEFAULT NULL,
`title` varchar(200) DEFAULT NULL,
`insert_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDBAUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
------------------------------
-- Records of user
------------------------------
INSERT INTO `user`VALUES ('1', '航三', '1', '有電腦','2017-05-02 15:40:19', '2017-05-03 15:40:22');
INSERT INTO `user`VALUES ('2', '理三', '1', '有電腦,生活就是游戲么。要努力啊', '2017-05-02 15:40:19', '2017-05-03 15:40:22');
INSERT INTO `user`VALUES ('3', '李四', '0', '準備工作完成之后就可以進行配置和操作了。', '2017-05-02 15:40:19', '2017-05-03 15:40:22');
INSERT INTO `user`VALUES ('4', '王五', '0', '這個demo主要是針對多圖片上傳時使用的,可以攜帶動態加載的參數。', '2017-05-02 15:40:19', '2017-05-0315:40:22');
INSERT INTO `user`VALUES ('5', '趙六', '1', 'demo里也有,多文件上傳+預覽功能。也可以自己去調U', '2017-05-25 15:43:03', '2017-05-25 15:43:07');
INSERT INTO `user`VALUES ('6', '周七', '0', '這個demo主要是針對多圖片上傳時使用的', '2017-05-02 15:43:23', '2017-05-11 15:43:26');
INSERT INTO `user`VALUES ('7', '李白', '1', '詩人','2017-05-02 15:43:23', '2017-05-02 15:43:25');
鏈接mysql驅動jar:mysql-connector-java-5.1.14.jar(這個基本都有)
和D:\solr-4.10.2\dist\solr-dataimporthandler-4.10.2.jar
從solr的解壓文件目錄中找到“D:\solr-4.10.2\example\example-DIH\solr\db\conf”下的db-data-config.xml文件到你的core(比如:
D:\solr-4.10.2\example\demo-solr\demo\conf)conf目錄下,并更名為data-config.xml。
詳細配置如下:
<dataConfig>
<dataSourcetype="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test" user="root"password="123456"
batchSize="100" />
<document>
<entity name="user"pk="id"
query="SELECTid,name,sex,title,insert_time,update_time FROM user"
deltaImportQuery="SELECTid,name,sex,title,insert_time,update_time FROM user whereid='${dataimporter.delta.id}'"
deltaQuery="SELECT id FROMuser where update_time > '${dataimporter.last_index_time}'">
<field column="id"name="id" />
<field column="name"name="name" />
<field column="sex"name="sex" />
<fieldcolumn="title" name="title" />
<fieldcolumn="insert_time" name="insertTime" />
<fieldcolumn="update_time" name="updateTime" />
</entity>
</document>
</dataConfig>
deltaImportQuery:獲取增量數據時使用的SQL(增量導入時使用)
deltaQuery:獲取pk的SQL(增量導入時使用)
注意查詢條件的寫法:${..},如在本例中:
${dataimporter.last_index_time}索引上次導入時間
${ dataimporter.delta.id}實體user查詢結果中的id,也可以用${user.id}表示
關于data-config.xml詳解,參考博文:
http://www.jianshu.com/p/91a5a0c35475
http://blog.csdn.net/boolbo/article/details/50352331
注意:如果是solr是使用tomcat進行啟動,只是相關的jar和配置文件放的位置不一樣。配置是一致的。
1、 拷貝mysql-connector-java-5.1.14.jar和solr-dataimporthandler-4.10.2.jar到solr的D:\solr-4.10.2\example\solr-webapp\webapp\WEB-INF\lib目錄中;
2,在D:\solr-4.10.2\example\demo-solr\demo\conf目錄下,更改solrconfig.xml配置文件。添加如下內容:
<requestHandlername="/dataimport"class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<strname="config">data-config.xml</str>
</lst>
</requestHandler>
3,在D:\solr-4.10.2\example\demo-solr\demo\conf目錄下,更改schema.xml配置,配置相關字段:
<?xmlversion="1.0" encoding="UTF-8" ?>
<schemaname="example" version="1.5">
<field name="_version_"type="long" indexed="true" stored="true"/>
<field name="_root_"type="string" indexed="true" stored="false"/>
<field name="id"type="string" indexed="true" stored="true"required="true" multiValued="false" />
<!-- 指定分詞類型-->
<field name="name"type="text_ik" indexed="true" stored="true" />
<field name="title"type="text_ik" indexed="true" stored="true"/>
<field name="sex"type="int" indexed="false" stored="true" />
<!-- field標簽中的name值必須和data-config.xml中的fileld標簽name值保持一致 -->
<field name="insertTime"type="date" indexed="true" stored="true" />
<field name="updateTime"type="date" indexed="true" stored="true"/>
<uniqueKey>id</uniqueKey>
<fieldType name="int"class="solr.TrieIntField" precisionStep="0"positionIncrementGap="0"/>
<fieldType name="string"class="solr.StrField" sortMissingLast="true" />
<fieldType name="long"class="solr.TrieLongField" precisionStep="0"positionIncrementGap="0"/>
<fieldType name="date"class="solr.TrieDateField" precisionStep="0"positionIncrementGap="0"/>
<!-- 添加IKAnalyzer中文分詞器 -->
<fieldType name="text_ik"class="solr.TextField">
<analyzerclass="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
</schema>
4,重啟solr應用,查看原有的數據:
還是原來的那些數據。
5,導入mysql數據到solr中:
選擇Dataimport進行導入操作。
查詢:
證明數據已經導入,并刪除了原來的數據!
Documents運行/update,指定type為xml。先查詢后刪除:
語句為:
<delete><query>*:*</query></delete>
<commit/>
Submit,執行刪除!
當然,上面說的是手動刪除,如果要刪除的數據很多,想在下一次自動同步數據的時候自動刪除指定的數據該如何做呢?
場景:有一批要拍賣的店鋪數據存儲在solr中,拍賣的店鋪數據有一個拍賣結束時間(endTime),當拍賣結束時間一到,這條存儲在solr中的拍賣數據就沒有意義了,想要刪除這條存儲在solr中的數據。
按照上面的手動刪除也不是不可以,但這人工操作未免太扯了,到時間人工去solr中刪除這條數據耗時又耗力,也不太現實。
解決辦法就是:
在data-config.xml的entity中添加:
deletedPkQuery="select id from shops where endTime < NOW()"
這一句,這句和entiy的query同級,目的是查詢出所有店鋪數據中結束時間小于當前時間的店鋪id,
這個店鋪id會和deltaQuery中收集到的id一并執行deltaImportQuery操作,只不過一個是添加數據,一個是刪除數據。
注意:這個配置在導入數據成功后,無效果。只在導入過程中有效果!
1、 將所有只用于搜索的,而不需要作為結果的field(特別是一些比較大的field)的stored設置為false;
2、 將不需要被用于搜索的,而只是作為結果返回的field的indexed設置為false;
3、 刪除所有不必要的copyField聲明為了索引字段的最小化和搜索的效率;
4、 將所有的 text fields的index都設置成false,然后使用copyField將他們都復制到一個總的 text field上,然后進行搜索。
看了以上介紹mysql導入數據到solr的方法,希望能給大家在實際運用中帶來一定的幫助。本文由于篇幅有限,難免會有不足和需要補充的地方,大家可以繼續關注億速云行業資訊板塊,會定期給大家更新行業新聞和知識,如有需要更加專業的解答,可在官網聯系我們的24小時售前售后,隨時幫您解答問題的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。