2007-07-25 23:57:20

MeCab-Senna-TritonnのRPMインストールとCatalystでのSearch

[Catalyst] [DBIx::Class] [MySQL]

※Fedora7を使用

[mecab導入]
楽だ。
yum -y mecab mecab-devel mecab-ipadic perl-mecab


[senna導入]
cd /home/hoge/rpmbuild/SOURCES
wget http://iij.dl.sourceforge.jp/senna/25607/senna-1.0.7.tar.gz
tar xzvf senna-1.0.7.tar.gz
SPEC発見。
cp senna-1.0.7/senna.spec /home/hoge/rpmbuild/SPECS/.
cd ../
rpmbuild -bb SPECS/senna.spec

あら、エラーが出た。
error: File /usr/src/redhat/SOURCES/libsenna-1.0.7.tar.gz: No such file or directory

SPEC修正。
vi SPECS/senna.spec

@@ -2,7 +2,7 @@
 %define release 1

 Summary: An Embeddable Fulltext Search Engine
-Name: libsenna
+Name: senna
 Version: %{version}
 Release: %{release}
 License: LGPL

再度ビルド。
rpmbuild -bb SPECS/senna.spec

以下のメッセージが出てRPMができた。
Wrote: /home/hoge/rpmbuild/RPMS/i386/senna-1.0.7-1.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/senna-devel-1.0.7-1.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/senna-debuginfo-1.0.7-1.i386.rpm

インストール
cd RPMS/i386/
rpm -ivh senna-1.0.7-1.i386.rpm senna-debuginfo-1.0.7-1.i386.rpm senna-devel-1.0.7-1.i386.rpm


[Tritonn + MySQL導入]
SennaのMySQLバインディングパッチが Tritonn という名の別プロジェクトになったらしい。
ex) http://qwik.jp/tritonn/about.html

cd SOURCES/
wget http://iij.dl.sourceforge.jp/tritonn/26391/mysql-5.0.41-tritonn-1.0.3.tar.gz
tar xzvf mysql-5.0.41-tritonn-1.0.3.tar.gz
現在使用中のディストリ版MySQLを上書きして使いたいので、RPM化する際に mysql-5.0.41 になってもらうことにする。
mv mysql-5.0.41-tritonn-1.0.3 mysql-5.0.41

Fedoraのtestにmysql-5.0.45-1があがっていたのでSRPMをもらう。
cd ../SRPMS/
wget ftp://ftp.riken.jp/Linux/fedora/updates/testing/7/SRPMS/mysql-5.0.45-1.fc7.src.rpm
rpm -ivh mysql-5.0.45-1.fc7.src.rpm
SPECを流用。
cd ../SPECS/
cp mysql.spec mysql-tritonn.spec
vi mysql-tritonn.spec

以下のように変更。
make testは通らないのでコメントアウトした(普通に./configureしても make test はエラーになったのであきらめた)。
--- mysql.spec  2007-07-23 07:16:27.000000000 +0900
+++ mysql-tritonn.spec  2007-07-25 10:31:57.000000000 +0900
@@ -1,15 +1,15 @@
 Name: mysql
-Version: 5.0.45
+Version: 5.0.41
 Release: 1%{?dist}
-Summary: MySQL client programs and shared libraries
+Summary: MySQL client programs and shared libraries and tritonn
 License: GPL
 Group: Applications/Databases
 URL: http://www.mysql.com

 # Regression tests take a long time, you can skip 'em with this
 %{!?runselftest:%define runselftest 1}

-Source0: http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-%{version}.tar.gz
+Source0: mysql-5.0.41.tar.gz
 Source1: mysql.init
 Source3: my.cnf
 Source4: scriptstub.c
@@ -153,6 +153,8 @@
 export CFLAGS CXXFLAGS

 %configure \
+       --with-senna=/usr \
+       --with-mecab=/usr \
        --with-readline \
        --with-openssl \
        --without-debug \
@@ -189,7 +191,7 @@
   esac
   export MTR_BUILD_THREAD

-  make test
+#  make test
 %endif

 %install


必要なファイルをコピーする(このままではman 関連が無くてエラーになる - 2007.7.26 0:16追記 mysql-5.0.41-tritonn-1.0.3.tar.gz のソース修正されてman入ったかも~未確認)。
cd ../SOURCES/
tar xzvf mysql-5.0.45.tar.gz
cp mysql-5.0.45/man/* mysql-5.0.41/man/.

mysql-5.041(Tritonn内蔵版)のtarボール作成する。
tar czvf mysql-5.0.41.tar.gz mysql-5.0.41

Build時必要なものをインストール。
yum install gperf readline-devel ncurses-devel

ビルド開始。
cd ../SPECS/
rpmbuild -ba mysql-tritonn.spec

できた。
Wrote: /home/hoge/rpmbuild/SRPMS/mysql-5.0.41-1.fc7.src.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-libs-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-server-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-devel-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-bench-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-test-5.0.41-1.fc7.i386.rpm
Wrote: /home/hoge/rpmbuild/RPMS/i386/mysql-debuginfo-5.0.41-1.fc7.i386.rpm

ここに置いておきます。
mysql-5.0.41-1.fc7.src.rpm
mysql-5.0.41-1.fc7.i386.rpm
mysql-bench-5.0.41-1.fc7.i386.rpm
mysql-debuginfo-5.0.41-1.fc7.i386.rpm
mysql-devel-5.0.41-1.fc7.i386.rpm
mysql-libs-5.0.41-1.fc7.i386.rpm
mysql-server-5.0.41-1.fc7.i386.rpm
mysql-test-5.0.41-1.fc7.i386.rpm

インストールする。
cd /home/hoge/rpmbuild/RPMS/i386/
rpm -Uvh mysql-*

以下URL参照に動作確認した。
http://qwik.jp/senna/check_install.html

念のためyumで上書きされないように yum.conf を編集。
vi /etc/yum.conf
exclude=mysql*


[Catalystで使ってみる]
FULLTEXTインデックスを作る。
mysql> CREATE FULLTEXT INDEX review_index ON goods_att(review);

カラムが text 型の場合、最大値255以下で指定
mysql> drop index review_index on goods_att;
mysql> CREATE FULLTEXT INDEX review_index ON goods_att(review(255));

以下の2パターンが使えるようだ。
ex1) http://asakura.g.hatena.ne.jp/asakura-t/comment?date=20070405
use SQL::Abstract::Fulltext::MySQL;
my $rs = $c->model('GoodsDB::GoodsAtt')->search({
    -fulltext => {
        -match   => 'review',
        -against => $q,
        -boolean => 1,
    },
});

ex2) http://blog.hide-k.net/archives/2006/08/dbixclassfullte.php
my $rs = $c->model('GoodsDB::GoodsAtt')->search({
})->search_literal('match(review) against(?)', $q);

ex1を使うことにする。
SQL::Abstract::Fulltext::MySQLを use して使用することにする。

Bench Mark してみる(マシンスペック - Celeron2.5GHz, Memory 384MB)。
Records: 121141

まずは普通に mysql クライアントから。
mysql> select count(*) from goods_att where match(review) against('強力');
+----------+
| count(*) |
+----------+
|     1492 |
+----------+
1 row in set (0.01 sec)

like 検索と比べる。
mysql> select count(*) from goods_att where review LIKE "%強力%";;
+----------+
| count(*) |
+----------+
|     1492 |
+----------+
1 row in set (0.62 sec)

次にCatalystで比較。4ワードで試した。
senna
0.339656s
0.840683s
6.052170s
0.880074s

like
2.199280s
1.740971s
12.650366s
1.220464s