Solr 教學 (4) – 使用 DataImport 匯入資料庫資料

好一陣子沒有用 Solr,接續前幾篇
Solr 教學 (1) – 安裝篇
Solr 教學 (2) – tomcat 7 以帳號密碼限制存取頁面
Solr 教學 (3) – 以 Remote Address Filter 限制存取
這篇文章要記錄一下怎麼把 MySQL 裡面的資料匯入成 Solr 的索引檔。
小蛙從參考資料1中發現匯入的動作好像不困難,就照著做下來,這邊也順便記錄一下可能會遇到的問題。

  1. 修改 solrconfig.xml,這個是前幾篇提到 core 下面的,小蛙的目錄是 /opt/solr/example/conf,這邊 db-data-config.xml 可以改成自己想要的名字,也可以直接使用相對路徑,考慮可能會有移機的狀況,還是盡可能使用相對路徑。
    1
    2
    3
    4
    5
    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
      <lst name="defaults">
        <str name="config">db-data-config.xml</str>
      </lst>
    </requestHandler>
  2. 新增資料庫連線檔 db-data-config.xml,這個檔名是上面自己設定的,跟 solrconfig.xml 放在同一個目錄下即可。依自己的環境修改 url, user, password,以及 SQL 語法及欄位對應,這邊的 field name 是資料庫的欄位。
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    <dataConfig>
      <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="myusername" password="mypassword"/>
        <document name="mydocument">
          <entity name="item" query="SELECT * FROM stockTable">
            <field column="ID" name="id" />
            <field column="SNO" name="no" />
            <field column="SNAME" name="name" />
            <field column="STYPE" name="type" />
          </entity>
      </document>
    </dataConfig>
  3. 修改 schema.xml,改成自己的設定
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" ?>
    <!--
     Licensed to the Apache Software Foundation (ASF) under one or more
     contributor license agreements. See the NOTICE file distributed with
     this work for additional information regarding copyright ownership.
     The ASF licenses this file to You under the Apache License, Version 2.0
     (the "License"); you may not use this file except in compliance with
     the License. You may obtain a copy of the License at
    Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
    -->
    <schema name="example core zero" version="1.1">
      <types>
        <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
      </types>
      <fields>
        <!-- general -->
        <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
        <field name="no" type="string" indexed="true" stored="true" multiValued="false" />
        <field name="name" type="string" indexed="true" stored="true" multiValued="false" />
        <field name="type" type="string" indexed="true" stored="true" multiValued="false" />
        <!-- 這個 _version_ 如果拿掉會報錯 -->
        <field name="_version_" type="long" indexed="true" stored="true"/>
      </fields>
      <!-- 主鍵 -->
      <uniqueKey>id</uniqueKey>
      <!-- 沒有設定欄位時的預設搜尋 -->
      <defaultSearchField>name</defaultSearchField>
      <!-- 空白串接關鍵字時預設使用 OR 或是 AND -->
      <solrQueryParser defaultOperator="OR"/>
    </schema>
  4. 這時候因為連結的是 MySQL,所以需要 mysql connector,假設使用的是 oracle 就要下載 ojdbc 來使用,MySQL Connector/J 到 MySQL 官網下載。選擇 Platform Independent 後下載壓縮檔,解壓縮後只需要裡面的 mysql-connector-java-x.x.xx-bin.jar 這個檔案,把這個檔案放在 solr lib 目錄下,以小蛙的環境為例,是直接放在 /var/lib/tomcat7/webapps/solr/WEB-INF/lib 目錄下,當 tomcat 啟動 solr 專案時就會自動被載入。
  5. 到這邊似乎都沒問題,在小蛙準備要重新啟動 tomcat 讓設定生效的時候,卻一直出現這樣子的錯誤
    1
    2
    3
    4
    5
    6
    7
    8
    org.apache.solr.common.SolrException: RequestHandler init failure
    ...
    Caused by: org.apache.solr.common.SolrException: RequestHandler init failure
    ...
    Caused by: org.apache.solr.common.SolrException: Error loading class 'org.apache.solr.handler.dataimport.DataImportHandler'
    ...
    Caused by: java.lang.ClassNotFoundException: org.apache.solr.handler.dataimport.DataImportHandler
    ...

    錯誤真的要看清楚,小蛙當時只有看到前三個,一直以為是設定檔哪裡出錯,一個一個找了好久,才發現第四個錯誤 java.lang.ClassNotFoundException,上面這些錯誤都是因為根本找不到 org.apache.solr.handler.dataimport.DataImportHandler 引起的,在網路上搜尋了一下,有一些網友分享這個檔案存在於下載回來 solr 的 dist 目錄中,可以透過在 solrconfig.xml 中設定 lib 的讀取路徑,小蛙則是把 solr-dataimporthandler-4.5.0.jar, solr-dataimporthandler-extras-4.5.0.jar 這兩個 jar 直接複製到 /var/lib/tomcat7/webapps/solr/WEB-INF/lib 目錄中。

  6. 重新啟動 tomcat 後,solr 畫面可以正常進入,左邊 Core Selector 下拉選單選到自己的 Core 後再選擇 DataImport,
    1
    2
    3
    4
    5
    6
    7
    // full-import : 全部匯入;delta-import : 只匯入變更部分
    Command -> full-import
    // verbose 打勾可以看到詳細訊息
    v Verbose
    // 選擇剛剛設定檔新增的名稱
    Entity -> item
    執行 Execute

    完成後可以看到「Indexing completed. Added/Updated: 12701 documents. Deleted 0 documents. (Duration: 14s)

  7. 大功告成!檢查看看是否正常匯入,點選左邊的 Query,測試 Execute Query 看看資料正不正確。

參考資料:

  1. [Solr] Solr 學習筆記(五) 設定 Data Import Handler 直接從 MySQL 把資料匯入 @ 長島冰茶的工程師筆記
    http://wbkuo.pixnet.net/blog/post/156125771-%5Bsolr%5D-solr-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98(%E4%BA%94)-%E8%A8%AD%E5%AE%9A-data-import-handler-%E7%9B%B4

Solr 系列文章:

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料