2014年10月27日 星期一

Solr_02_建立DB CORE並查詢

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也要補上這三個欄位的值
    1. AdMenuItemSid  -> menu_id
    2. Name                  -> menu_name 
    3. 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 否則容易出錯

  • 接下來要加入中文分詞器,才能對中文進行準確索引
    1. 先 下載 IK 中文分詞器(此中文分詞器僅支援簡體中文,如果要加入繁中的話,請參閱 06_IK分詞器建立繁體中文詞庫)
      下載完畢後,將 
      IKAnalyzer2012FF_u1.jar
      解壓縮放至C:\mysolr\example\solr\db\lib 這個目錄內
    2. 除了jar檔外,請檢查文件是否為utf-8格式
    3. 將IKAnaylyzer.xfg.xml裡頭對於ext.dic的註解請拿掉
    4. 將以下三個檔案放至 C:\mysolr\example\solr-webapp\webapp\WEB-INF\classes (如果沒有classes資料夾請自己建立)
      1. IKAnaylyzer.xfg.xml
      2. stopword.dic 
      3. ext.dic (如果沒有請自己建立)
        1. IKAnaylyzer.xfg.xml = 配置,擴展詞典及停止詞典
        2. stopword.dic = 不需索引的自訂義詞典
        3. ext.dic            = 需要額外擴展索引的自訂義詞
  • 重新編輯 C:\mysolr\example\solr\db\conf\schema.xml 檔。
    1.加入TAG <fieldType>
    2.修改TAG<field> menu_name 的type 為 text_ik 
    3.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" />
     
    1. menu_id:[0 TO 5] =  介於 0 ~ 5 之間的menu_id (TO 要大寫)
    2. wt = 反回格式
    3. indent = 縮排
    4. 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}]
      }} 

沒有留言:

張貼留言