FAT47の底辺インフラ議事録

学んだことのメモ帳です

CentOS5.7で全文検索エンジンApache Solr3.4.0のインストールからMySQLデータのインポートまで

Apache Solr


http://lucene.apache.org/solr/

Apache Solr(ソーラー)はApacheコミュニティによってオープンソースで開発されている全文検索エンジンです。
Apache LuceneのHTTPラッパーのようなものです。
Luceneでは全文検索を行う為にはそれなりにコードを書かなければいけないですが、Solrを使うとSolrに対してHTTPのリクエストを行うだけで指定したデータをHTTPレスポンスで返してきてくれます。
利用するにはTomcatなどのサーブレットコンテナを利用する必要があります。

MySQLのデータベースにあるデータをSolrにインポートしてデータを検索するといったことも可能です。
現時点(2011/09/16)で最新のSolrは3.4.0です。1.4.xの時は同梱されていたJettyのバージョンは6.13でしたが、Solr3.4.0では6.1.26になっています。
Solr3.1〜3.3はインデキシング中にマシンがクラッシュしたり停止した場合、インデックスが破壊されてしまうことがあるので利用しないほうがよいらしいです(3.4で修正)

情報元:第6回Solr勉強会に参加しました。


事前準備
JDKのダウンロード

http://java.sun.com/javase/ja/6/download.html

Solr3.4のダウンロード

wget http://ftp.kddilabs.jp/infosystems/apache//lucene/solr/3.4.0/apache-solr-3.4.0.tgz

JDBCダウンロード

wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.17.zip/from/http://ftp.iij.ad.jp/pub/db/mysql/

JDKのインストール

chmod +x /home/work/jdk-6u25-linux-x64-rpm.bin
/home/src/jdk-6u25-linux-x64-rpm.bin

Apache Solrのインストール

tar zxvf apache-solr-3.4.0.tgz 
mv apache-solr-3.4.0 /usr/local/
ln -s /usr/local/apache-solr-3.4.0 /usr/local/apache-solr

solrの起動スクリプトを作成する

vi /etc/init.d/solr
#!/bin/sh
# chkconfig: 345 90 90
# description: Solr Boot
JETTY_HOME_DIR=/usr/local/apache-solr/example/
cd $JETTY_HOME_DIR
JAVA="/usr/bin/java"
LOG_FILE="/var/log/solr.log"

KEY=stopkey
CORE=solr
cd $JETTY_HOME_DIR
start() {
  $JAVA -Dsolr.solr.home=$CORE -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar >> $LOG_FILE 2>&1 &
  echo "Solr started!"
}

stop() {
  $JAVA -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar --stop
  echo "Solr stopped!"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
      stop
      start
      ;;
    *)
      echo "Usage: $0 {start|stop|restart}"
      exit 1
esac

JDBCのインストール

mkdir /usr/local/apache-solr/example/solr/lib
unzip mysql-connector-java-5.1.17.zip
cp mysql-connector-java-5.1.17/mysql-connector-java-5.1.17-bin.jar /usr/local/apache-solr/example/solr/lib/

起動

chmod 755 /etc/init.d/solr
chkconfig --add solr
/etc/init.d/solr start

動作テスト用スキーマの作成

mysql> CREATE DATABASE products;
mysql >GRANT ALTER,SELECT,INSERT,UPDATE,DELETE ON products.* TO user@localhost IDENTIFIED BY 'password';
mysql> flush privileges;

mysql> CREATE TABLE maker (
  mid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(16) NOT NULL
) ENGINE=InnoDB;

mysql> CREATE TABLE product (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  mid INT UNSIGNED NOT NULL,
  name VARCHAR(16) NOT NULL
) ENGINE=InnoDB;

INSERT INTO maker(name) VALUES('au');
INSERT INTO maker(name) VALUES('DoCoMo');
INSERT INTO maker(name) VALUES('Softbank');
INSERT INTO product(mid, name) VALUES (1, 'IS01');
INSERT INTO product(mid, name) VALUES (1, 'CA002');
INSERT INTO product(mid, name) VALUES (1, 'W63K');
INSERT INTO product(mid, name) VALUES (2, 'BlackBerry');
INSERT INTO product(mid, name) VALUES (3, 'iPhone');
INSERT INTO product(mid, name) VALUES (3, 'かんたん携帯');

Apache Solrの設定

solrconfig.xmlの設定
以下の内容をのどこかに追記

vi /usr/local/apache-solr/example/solr/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>

data-config.xmlの作成

vi /usr/local/apache-solr/example/solr/conf/data-config.xml
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/products" user="db_user" password="****"/>
<document>
   <entity name="product" query="select * from product">
     <field column="id" name="id" />
     <field column="name" name="product" />
     <entity name="maker" query="select * from maker where mid = '${product.mid}'">
       <field column="name" name="name" />
     </entity>
   </entity>
</document>

</dataConfig>

schema.xmlの設定

vi /usr/local/apache-solr/example/solr/conf/schema.xml

の中に↓を追加します。

<field name="product" type="text_general" indexed="true" stored="true"/>

の値をproductに変更

 <defaultSearchField>product</defaultSearchField>

Solr再起動

/etc/init.d/solr restart

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

http://localhost:8983/solr/dataimport?command=full-import

検索確認

http://localhost:8983/solr/admin/

管理画面にあるQuery String:の部分に検索語入力 例:iphone
もしくは

http://localhost:8983/solr/select/?q=iphone

にアクセスし帰ってきたXMLに検索結果が含まれていれば成功です。

<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">0</int>
        <lst name="params">
            <str name="q">iphone</str>
        </lst>
    </lst>
    <result name="response" numFound="1" start="0">
        <doc>
            <str name="id">5</str>
            <str name="name">Softbank</str>
            <str name="product">iPhone</str>
        </doc>
    </result>
</response>