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で修正)
事前準備
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
esacJDBCのインストール
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"/>
<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>