BLOGTIMES
2011/05/06

Solr でデータベースをインデックス化する

  solr 
このエントリーをはてなブックマークに追加

これまでSolrを使うときにはデータはテキストファイルに書き出して、それをXMLに変換してPOSTで送ってデータを登録するということをやっていたのですが、DBのデータを無加工でSolrに入れたいということも多くなってきたので、初めてData Import Request Handlerという機能を使ってみました。この機能を使うとDBの内容を直接Solrのコアに取り込むことができます。

パフォーマンス的にもXMLへのエンコード/デコードの負荷が大きかったので、データの投入もかなりスピーディーに行えるようになったので満足です。

以下、設定メモ。

SolrのData Import Request Handlerを使ったデータベースのインデックス化の手順

1.コアを作る

今回は Solr は 3.1.0 を使いました。単純に配布されているアーカイブを展開し、apache-solr-3.1.0/example/core_name という名前でコアを作るということを前提にします。まずは通常どおり apache-solr-3.1.0/example/core_name/schema.xml を編集してスキーマを定義しておきます。ここまでは通常のSolrのコアの設定と変わりません。

2.JDBCドライバを入れる

次に apache-solr-3.1.0/example/core_name/lib というディレクトリを作ってここに利用するJDBCドライバのjarを入れておきます。これを忘れるとデータベースに接続できません。

3.solrconfig.xmlを編集する

Data Import Request Handlerを有効化するために apache-solr-3.1.0/example/core_name/conf/solrconfig.xml に下記を追加します。

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>

4.設定ファイルを作る

Data Import Request Handlerの設定ファイルである apache-solr-3.1.0/example/core_name/conf/data-config.xml を新規作成します。例えばこんな感じ

<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/db_name" user="db_user" password="db_password"/> <document name="example"> <entity name="hoge1" query="SELECT text1, text2, text3 FROM table_name"> <field column="text1" name="solr_text_field1" /> <field column="text2" name="solr_text_field2" /> <field column="text3" name="solr_text_field3" /> </entity> </document> </dataConfig>

5.データベースの内容をインデックスさせる

http://solrhost:8983/solr/dataimport にアクセスして、下記のようなxmlが出るのを確認する。

<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3</int> </lst> <lst name="initArgs"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </lst> <str name="status">idle</str> <str name="importResponse"/> <lst name="statusMessages"/> <str name="WARNING"> This response format is experimental. It is likely to change in the future. </str> </response>

http://solrhost:8983/solr/dataimport?command=full-import にアクセスするとインデックスが始まります。
最初のURLにアクセスするとstatusが変わって、インデックスが進んでいく様子が確認できます。

あとはSolrとして普通に検索するだけです。

おまけ

jettyの起動終了用のスクリプトを書いたので、こちらもメモ代わりに。

solr.sh

#!/bin/bash BASENAME=`basename $0 .sh` SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR KEY=shutdown_password CORE=core_name LOG=$BASENAME.log start() { java -Dsolr.solr.home=$CORE -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar >> $LOG 2>&1 & echo "$BASENAME started!" } stop() { java -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar --stop echo "$BASENAME stopped!" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4202
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン