天天看點

使用Solr索引MySQL資料

環境搭建

2、解壓到某個目錄

3、cd into D:\Solr\solr-4.10.3\example

4、Execute the server by “java -jar startup.jar”Solr會自動運作在自帶的Jetty上

PS:solr-5.0 以上預設對schema的管理是使用managed-schema,不能手動修改,需要使用Schema Restful的API操作。如果要想手動修改配置,把managed-schema拷貝一份修改為schema.xml,在solrconfig.xml中修改如下:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

建立MySQL資料

DataBase Name: mybatis

Table Name: user

Db.sql

使用Solr索引MySQL資料

 View Code

使用DataImportHandler導入并索引資料

1) 配置D:\Solr\solr-4.10.3\example\solr\collection1\conf\solrconfig.xml

在<requestHandler name="/select" class="solr.SearchHandler">前面上加上一個dataimport的處理的Handler

使用Solr索引MySQL資料
使用Solr索引MySQL資料

2) 在同目錄下添加data-config.xml

使用Solr索引MySQL資料
使用Solr索引MySQL資料

說明:

dataSource是資料庫資料源。

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

Field對應一個字段,column是資料庫裡的column名,後面的name屬性對應着Solr的Filed的名字。

3) 修改同目錄下的schema.xml,這是Solr對資料庫裡的資料進行索引的模式

(1)保留_version_ 這個field

(2)添加索引字段:這裡每個field的name要和data-config.xml裡的entity的field的name一樣,一一對應。

使用Solr索引MySQL資料
使用Solr索引MySQL資料

(3)删除多餘的field,删除copyField裡的設定,這些用不上。注意:text這個field不能删除,否則Solr啟動失敗。

(4)設定唯一主鍵:<uniqueKey>id</uniqueKey>,注意:Solr中索引的主鍵預設是隻支援type="string"字元串類型的,而我的資料庫中id是int型的,會有問題,解決方法:修改同目錄下的elevate.xml,注釋掉下面2行,這貌似是Solr的Bug,原因不明。

4)拷貝mysql-connector-java-5.1.22-bin.jar和solr-dataimporthandler-4.10.3.jar到D:\Solr\solr-4.10.3\example\solr-webapp\webapp\WEB-INF\lib。一個是mysql的java驅動,另一個在D:\Solr\solr-4.10.3\dist目錄裡,是org.apache.solr.handler.dataimport.DataImportHandler所在的jar。

重新開機Solr。

如果配置正确就可以啟動成功。

solrconfig.xml是solr的基礎檔案,裡面配置了各種web請求處理器、請求響應處理器、日志、緩存等。

schema.xml配置映射了各種資料類型的索引方案。分詞器的配置、索引文檔中包含的字段也在此配置。

索引測試

點選Dataimport,Command選擇full-import(預設),點選“Execute”,Refresh Status就可以看到結果:

Indexing completed. Added/Updated: 7 documents.Deleted 0 documents.

Requests: 1, Fetched: 7, Skipped: 0, Processed: 7

Started: 8 minutes ago

Query測試:在q中輸入userName:test1進行檢索就可以看到結果。

這裡使用full-import索引了配置資料庫中的全部資料,使用Solr可以查詢對應的資料。

使用Solrj索引并檢索資料

上面是使用Solr Admin頁面上的功能測試索引和檢索,也可以使用代碼來操作Solr,下面的代碼測試了在Solr索引中添加了一個User類實體,并通過查找所有的index來傳回結果。

User實體類:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

使用@Field注解的屬性要和Solr配置的Field對應。

測試代碼:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

如果在資料庫中添加一條資料,但是Solr索引中沒有index這條資料,就查不到,是以一般在使用Solr檢索資料庫裡的内容時,都是先插入資料庫,再在Solr中index這條資料,使用Solr的模糊查詢或是分詞功能來檢索資料庫裡的内容。

DIH增量從MYSQL資料庫導入資料

已經學會了如何全量導入MySQL的資料,全量導入在資料量大的時候代價非常大,一般來說都會适用增量的方式來導入資料,下面介紹如何增量導入MYSQL資料庫中的資料,以及如何設定定時來做。

1)資料庫表的更改

前面已經建立好了一個User的表,這裡為了能夠進行增量導入,需要新增一個字段updateTime,類型為timestamp,預設值為CURRENT_TIMESTAMP。

有了這樣一個字段,Solr才能判斷增量導入的時候,哪些資料是新的。

因為Solr本身有一個預設值last_index_time,記錄最後一次做full import或者是delta import(增量導入)的時間,這個值存儲在檔案conf目錄的dataimport.properties檔案中。

2)data-config.xml中必要屬性的設定

transformer 格式轉化:HTMLStripTransformer 索引中忽略HTML标簽

query:查詢資料庫表符合記錄資料

deltaQuery:增量索引查詢主鍵ID  注意這個隻能傳回ID字段   

deltaImportQuery:增量索引查詢導入的資料 

deletedPkQuery:增量索引删除主鍵ID查詢 注意這個隻能傳回ID字段   

有關“query”,“deltaImportQuery”, “deltaQuery”的解釋,引用官網說明,如下所示:

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

如果需要關聯子表查詢,可能需要用到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的說明文檔。

針對User表,data-config.xml檔案的配置内容如下:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

增量索引的原理是從資料庫中根據deltaQuery指定的SQL語句查詢出所有需要增量導入的資料的ID号。

然後根據deltaImportQuery指定的SQL語句傳回所有這些ID的資料,即為這次增量導入所要處理的資料。

核心思想是:通過内置變量“${dih.delta.id}”和 “${dataimporter.last_index_time}”來記錄本次要索引的id和最近一次索引的時間。

注意:剛新加上的updateTime字段也要在field屬性中配置,同時也要在schema.xml檔案中配置:

如果業務中還有删除操作,可以在資料庫中加一個isDeleted字段來表明該條資料是否已經被删除,這時候Solr在更新index的時候,可以根據這個字段來更新哪些已經删除了的記錄的索引。

這時候需要在dataConfig.xml中添加:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

這時候Solr進行增量索引的時候,就會删除資料庫中isDeleted=1的資料的索引。

測試增量導入

如果User表裡有資料,可以先清空以前的測試資料(因為加的updateTime沒有值),用我的Mybatis測試程式添加一個User,資料庫會以目前時間指派給該字段。在Solr中使用Query查詢所有沒有查詢到該值,使用dataimport?command=delta-import增量導入,再次查詢所有就可以查詢到剛剛插入到MySQL的值。

設定增量導入為定時執行的任務

可以用Windows計劃任務,或者Linux的Cron來定期通路增量導入的連接配接來完成定時增量導入的功能,這其實也是可以的,而且應該沒什麼問題。

但是更友善,更加與Solr本身內建度高的是利用其自身的定時增量導入功能。

1、下載下傳apache-solr-dataimportscheduler-1.0.jar放到\solr-webapp\webapp\WEB-INF\lib目錄下:

注意:apache-solr-dataimportscheduler-1.0.jar有bug,參考:http://www.denghuafeng.com/post-242.html

2、修改solr的WEB-INF目錄下面的web.xml檔案:

為<web-app>元素添加一個子元素

使用Solr索引MySQL資料
使用Solr索引MySQL資料

3、建立配置檔案dataimport.properties:

在SOLR_HOME\solr目錄下面建立一個目錄conf(注意不是SOLR_HOME\solr\collection1下面的conf),然後用解壓檔案打開apache-solr-dataimportscheduler-1.0.jar檔案,将裡面的dataimport.properties檔案拷貝過來,進行修改,下面是最終我的自動定時更新配置檔案内容:

使用Solr索引MySQL資料
使用Solr索引MySQL資料

這裡為了做測試每1分鐘就進行一次增量索引,同時disable了full-import全量索引。

4、測試

在資料庫中插入一條資料,在Solr Query中查詢,剛開始查不到,Solr進行一次增量索引後就可以查詢到了。

一般來說要在你的項目中引入Solr需要考慮以下幾點:

1、資料更新頻率:每天資料增量有多大,及時更新還是定時更新

2、資料總量:資料要儲存多長時間

3、一緻性要求:期望多長時間内看到更新的資料,最長允許多長時間延遲

4、資料特點:資料源包括哪些,平均單條記錄大小

5、業務特點:有哪些排序要求,檢索條件

6、資源複用:已有的硬體配置是怎樣的,是否有更新計劃

參考:

http://wiki.apache.org/solr/DataImportHandler

http://wiki.apache.org/solr/Solrj

http://www.denghuafeng.com/post-242.html

    本文轉自阿凡盧部落格園部落格,原文連結:http://www.cnblogs.com/luxiaoxun/p/4442770.html,如需轉載請自行聯系原作者