Rastにつづいて、Sennaを試してみる。
Sennaは、組み込み型の全文検索エンジンで、データベースなどと一緒に使えて、しかもN-gramインデックスを備えてます。インストールは開発者やPatchの作成者のおかげで思ったより楽でした。
OSは今回はCentOS4.0。何も使ってないマシンにいれました。
MySQLが動いているマシンだとさすがに怖い。
MecabにPatchをあててインストール
# wget http://dev.razil.jp/archive/mecab-0.81.mte.patch.20050423
# tar zxf mecab-0.81.tar.gz
# cp ipadic-2.5.1.tar.gz mecab-0.81/dic/
# cd mecab-0.81/dic/
# tar zxf ipadic-2.5.1.tar.gz
# cd ..
# patch -p1 < ../mecab-0.81.mte.patch.20050423
# ./configure --enable-mutex --prefix=/usr
# make
# make install
Sennaのコンパイルとインストール。
今回は、デイリースナップショットから入れました。
# wget http://dev.razil.jp/archive/senna/senna-20050601-svn.tar.gz
# tar zxf senna-20050601-svn.tar.gz
# ./configure --prefix=/usr
# make
# make install
MySQLのインストール。
コンパイルオプションは、MySQLのドキュメントや、rpmのSPECS、MLのこちらのメッセージを参考にしました。
# /usr/sbin/groupadd -g 27 mysql
# /usr/sbin/useradd -g mysql -u 27 -d /var/lib/mysql mysql
# wget http://dev.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.24.tar.gz/from/ftp://ftp.u-aizu.ac.jp/ftp/pub/dbms/mysql/mysql.com/
# tar zxf mysql-4.0.24.tar.gz
# cd mysql-4.0.24
# patch -p1 < ../senna/bindings/mysql/mysql-4.0.24.senna.diff
# autoconf
# CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ?
./configure ?
--prefix=/usr ?
--with-extra-charsets=complex ?
--with-charset=ujis ?
--enable-thread-safe-client ?
--enable-local-infile ?
--enable-assembler ?
--with-client-ldflags=-all-static ?
--with-mysqld-ldflags=-all-static ?
--with-mysqld-user=mysql ?
--localstatedir=/var/lib/mysql ?
--with-unix-socket-path=/var/lib/mysql/mysql.sock
# touch ./Docs/Images/cluster-components-1.txt
# touch ./Docs/Images/multi-comp-1.txt
# touch ./Docs/errmsg-table.texi
# touch ./Docs/cl-errmsg-table.texi
# make
# make install
# ./scripts/mysql_install_db
# chown -R mysql.mysql /var/lib/mysql
# chmod 755 /var/lib/mysql
# cp support-files/my-medium.cnf /etc/my.cnf
mysqld_safeとして起動で、起動後にパスワードの設定を忘れないように。
テストはこんな感じで。
まず。データベースとテーブルを作ります。
mysql> create database sennatest;
mysql> use sennatest
mysql> create table articles(
-> id int unsigned not null auto_increment primary key,
-> body text,
-> fulltext(body)
->);
Query OK, 0 rows affected (0.01 sec)
データを入力。はてなブックマークの人気サイトのタイトルだけ持ってきてみました。
mysql> insert into articles values
-> (null,"郵貯民営化は重要な問題だと思う "),
-> (null,"スローライフを志向するiPodの強み - CNET Japan"),
-> (null,"HTML, CSS, Photoshopを同時に学べるサンプル付きデザイン記事:Goodpic"),
-> (null,"jazzanovaの日記 - 現在顧問弁護士に相談中であり、対応についても検討中"),
-> (null,"mixi非公式ニュースサイト - mixiの問題人物Kusakabe氏、強制退会に?"),
-> (null,"むだづかいにっき♂:ネット上で議論を仕掛ける事について"),
-> (null,"はてな perl ハッカーの方々にお聞きします。近頃ますます良い感じなperlですが、どのような開発環境で開発していますでしょうか。"),
-> (null,"シナトラ千代子 - 投げ銭が飛び交うなかでダイアリーに立てこもる、という意味。"),
-> (null,"Going My Way: Skypeの会話をPodcast用に録音する場合の設定方法"),
-> (null,"Kusakabeさんがmixiの一部?を賑わしている。彼にmixi強制退会が言い渡されたのだ。"),
-> (null,"Ringo's Weblog: googleと競合しない方法2 "),
-> (null,"Moleskin Diary - 投げ銭よりたれ銭"),
-> (null,"第38回 海外メディアが伝えた小泉・郵政解散劇の評判 - nikkeibp.jp - 立花隆の「メディア ソシオ-ポリティクス」"),
-> (null,"ほその日記 - フォームが変更された事を知る"),
-> (null,"総選挙はてなと公職選挙法:北海道に住む国家公務員日記 "),
-> (null,"はてな、政党を株式に見立てて総選挙結果を予測 - CNET Japan");
Query OK, 16 rows affected (0.06 sec)
Records: 16 Duplicates: 0 Warnings: 0
検索をしてみます。日本語で検索ができていれば以下の検索結果になると思います。
mysql> select * from articles where match (body) against ('はてな');
+----+----------------------------------------------+
| id | body |
+----+----------------------------------------------+
| 7 | はてな perl ハッカーの方々にお聞きします〜
| 15 | 総選挙はてなと公職選挙法:北海道に住む国家公務員日記
| 16 | はてな、政党を株式に見立てて総選挙結果を予測〜
+----+----------------------------------------------+
3 rows in set (0.01 sec)