Uploading Structured Data Store Data with the Data Import Handler
01的內容有簡短的提到資料匯入的方式,但主要作業的運行環境是索引資料庫的,所以以下範例以資料庫為主
- 首先到 C:\mysolr\example\example-DIH\solr 這個資料夾底下copy db這個資料夾(這個資料夾為官方提供的DB範例資料)
- 移動到C:\mysolr\example\solr 並且把剛copy 的 db資料夾放在這裡
- copy 完畢後 編輯 C:\mysolr\example\solr\db\conf\solrconfig.xml 這個設定檔
- 找到這一段內容(大約在line 50~150 之間)
<lib dir="../../../../dist/" regex="solr-dataimporthandler-.*\.jar" /> <lib dir="../../../../contrib/extraction/lib" regex=".*\.jar" /> <lib dir="../../../../dist/" regex="solr-cell-\d.*\.jar" /> <lib dir="../../../../contrib/clustering/lib/" regex=".*\.jar" /> <lib dir="../../../../dist/" regex="solr-clustering-\d.*\.jar" /> <lib dir="../../../../contrib/langid/lib/" regex=".*\.jar" /> <lib dir="../../../../dist/" regex="solr-langid-\d.*\.jar" /> <lib dir="../../../../contrib/velocity/lib" regex=".*\.jar" /> <lib dir="../../../../dist/" regex="solr-velocity-\d.*\.jar" />
- 將其相對路徑修改成以下樣子(因為變更資料夾位置所以相對位置也要跟著變動)
<lib dir="../../../dist/" regex="solr-dataimporthandler-.*\.jar" /> <lib dir="../../../contrib/extraction/lib" regex=".*\.jar" /> <lib dir="../../../dist/" regex="solr-cell-\d.*\.jar" /> <lib dir="../../../contrib/clustering/lib/" regex=".*\.jar" /> <lib dir="../../../dist/" regex="solr-clustering-\d.*\.jar" /> <lib dir="../../../contrib/langid/lib/" regex=".*\.jar" /> <lib dir="../../../dist/" regex="solr-langid-\d.*\.jar" /> <lib dir="../../../contrib/velocity/lib" regex=".*\.jar" /> <lib dir="../../../dist/" regex="solr-velocity-\d.*\.jar" />
- 修改相對路徑完後,啟動solr並到主控台,並點選core admin會發現新增一個DB的core,numDocs跟MaxDoc指的是建立的索引數量,可以對照另一個collection1下去比對
接下來要匯入專案的資料,本例以fusion 的 ad_menuItem作範例
編輯 C:\mysolr\example\solr\db\conf\db-data-config.xml 檔案,並修改如下<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/fusion" user="root" password="root"/> <document> <entity name="item" query="select AdMenuItemSid,Name,Url from ad_menuitem" deltaQuery="select Name from ad_menuitem where Updated > '${dataimporter.last_index_time}'"> <field column="AdMenuItemSid" name="menu_id" /> <field column="Name" name="menu_name" /> <field column="Url" name="menu_url" /> </entity> </document> </dataConfig>
修改完畢後在C:\mysolr\example\solr\db\lib 資料夾底下放入mysql.jar mysql-connector-java-5.1.27.jar- 編輯 C:\mysolr\example\solr\db\conf\schema.xml 檔案 以對應db-data-config.xml結構。(solr 5.0版本後可能會取消多個TAG結構)
db-data-config.xml 只有用到 ad_menuitem 三個欄位,並且已更改為自訂的欄位名稱,所以在schema.xml也要補上這三個欄位的值- AdMenuItemSid -> menu_id
- Name -> menu_name
- Url -> menu_url
- 首先移除不需要的範例 TAG
1.將TAG <field>全部刪除,只留下以下幾個
<field name="_version_" type="long" indexed="true" stored="true"/> <field name="_root_" type="string" indexed="true" stored="false"/> <field name="content" type="text_general" indexed="false" stored="true" multiValued="true"/> <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> <field name="text_rev" type="text_general_rev" indexed="true" stored="false" multiValued="true"/> <field name="manu_exact" type="string" indexed="true" stored="false"/> <field name="payloads" type="payloads" indexed="true" stored="true"/>
2.將 TAG <copyField> 全數刪除 - 加入新增的三個欄位,並且將uniqueKey 修改為 menu_id
<field name="menu_id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="menu_name" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="menu_url" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <uniqueKey>menu_id</uniqueKey>
在這裡有一點需要注意TAG <uniqueKey>的type 最好為 string 否則容易出錯 - 接下來要加入中文分詞器,才能對中文進行準確索引
- 先 下載 IK 中文分詞器(此中文分詞器僅支援簡體中文,如果要加入繁中的話,請參閱 06_IK分詞器建立繁體中文詞庫)
下載完畢後,將 IKAnalyzer2012FF_u1.jar
解壓縮放至C:\mysolr\example\solr\db\lib 這個目錄內 - 除了jar檔外,請檢查文件是否為utf-8格式
- 將IKAnaylyzer.xfg.xml裡頭對於ext.dic的註解請拿掉
- 將以下三個檔案放至 C:\mysolr\example\solr-webapp\webapp\WEB-INF\classes (如果沒有classes資料夾請自己建立)
- IKAnaylyzer.xfg.xml
- stopword.dic
- ext.dic (如果沒有請自己建立)
- IKAnaylyzer.xfg.xml = 配置,擴展詞典及停止詞典
- stopword.dic = 不需索引的自訂義詞典
- ext.dic = 需要額外擴展索引的自訂義詞典
- 先 下載 IK 中文分詞器(此中文分詞器僅支援簡體中文,如果要加入繁中的話,請參閱 06_IK分詞器建立繁體中文詞庫)
- 重新編輯 C:\mysolr\example\solr\db\conf\schema.xml 檔。
1.加入TAG <fieldType>
2.修改TAG<field> menu_name 的type 為 text_ik3.TAG <fieldType> name 對應的是TAG <field> type<field name="menu_name" type="text_ik" indexed="true" stored="true" required="true" multiValued="true" /> <!-- 中文分詞器 --> <fieldType name="text_ik" class="solr.TextField"> <!-- 當 menu_name 執行建立索引時,便會觸發IKAnalyzer --> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <!-- 當 menu_name 查詢索引,便會觸發IKAnalyzer --> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
- 以上修改完畢後,重新啟動 solr server 並且到主控台(在啟動過程時,請注意是否有錯誤出現,如果有錯誤出現,請排除後繼續)
到主控台後 core 選擇 db 並且 點選 DataImport ,展開右側的Configuration可以看到db-data-config.xml的設定
確定都沒問題後點擊Execute開始建入索引,索引過程如果出現錯誤請進行排除(查看log或是看cmd),要查看索引建立完畢沒除了看CMD外也可以點擊Refresh Status 查看是否建立完畢。 - 點選左側的Query開始進行查詢
- 測試查詢menu_name內容
cURL(XML) http://localhost:8983/solr/db/select?q=menu_name:管理
cURL(JSON) http://localhost:8983/solr/db/select?q=menu_name:管理&wt=json&indent=true - 如果在schema.xml中將menu_id 的 type 改為 int 就可以搜尋數字區間的結果
<field name="menu_id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
- menu_id:[0 TO 5] = 介於 0 ~ 5 之間的menu_id (TO 要大寫)
- wt = 反回格式
- indent = 縮排
- rows = 最多顯示列數 (預設只有10筆)
{ "responseHeader":{ "status":0, "QTime":1, "params":{ "indent":"true", "q":"menu_id:[0 TO 5]", "wt":"json", "rows":"100"}}, "response":{"numFound":5,"start":0,"docs":[ { "menu_name":["Root Menu 123"], "menu_id":1, "menu_url":[""], "_version_":1479017297362288640}, { "menu_name":["線上學習"], "menu_id":2, "menu_url":["/portal/learn"], "_version_":1479017297534255104}, { "menu_name":["總帳管理"], "menu_id":3, "menu_url":["/portal/learn/account.xhtml"], "_version_":1479017297534255105}, { "menu_name":["請款管理"], "menu_id":4, "menu_url":["/portal/learn/payment.xhtml"], "_version_":1479017297535303680}, { "menu_name":["出差申請相關設定"], "menu_id":5, "menu_url":["/portal/learn/travelRequest.xhtml"], "_version_":1479017297535303681}] }}
沒有留言:
張貼留言