MySQL + Sennaで日本語全文検索をやってみた

以前の記事(MySQLで全文検索できるって!?)で、id:tomyheroさんからMySQLの日本語全文検索は無理だからSennaで出来るよと教えてもらったので、やってみた。

基本的に構築系の作業は、自分の作業ログをメモ帳に記入しているんだけど、まとめるのが面倒でブログにそれを投稿してこなかったけど、これからは少しずつ溜まっているメモ書きをブログにアップしよう。

Sennaは日本語の字句解析のmecabを使って単語に分けて登録し、それを元に全文検索を行う。MySQLsennaを組み込み、MySQLの関数をラッピングするのにtritonというものを使う。これはMySQLにパッチを当てたものです。

今回は、自分のホームディレクトリにsennamecabmecab辞書、tritonをインストールしてみました。MySQLは元々動いているものがあったので、別ポートで動くようにインストールしてます。

■mecabインストール
 ./configure --prefix=/home/hogehoge/public_html/senna/bin/mecab 

■mecab辞書インストール
 ./configure --prefix=/home/hogehoge/public_html/senna/bin/mecab-ipadic --with-charset=utf8 --with-mecab-config=/home/hogehoge/public_html/senna/bin/mecab --with-dicdir=/home/hogehoge/public_html/senna/bin/mecab-ipadic

 makeでmecab-dict-indexが見つからないエラーが発生
  vi Makefile
    
	mecab_dict_index = /mecab-dict-index
	上記を下記に変更
	mecab_dict_index = /home/hogehoge/public_html/senna/bin/mecab/libexec/mecab/mecab-dict-index

 make install
■sennaのインストール
 export LD_LIBRARY_PATH=/home/hogehoge/public_html/senna/bin/mecab/lib
 ./configure --prefix=/home/hogehoge/public_html/senna/bin/senna --with-mecab-config=/home/hogehoge/public_html/senna/bin/mecab/bin/mecab-config LDFLAGS="-L/home/hogehoge/public_html/senna/bin/mecab/lib"
  


■Mysql + tritonn インストール
 ./configure --prefix=/home/hogehoge/public_html/senna/bin/mysql --with-extra-charset=all --with-mysqld-user=mysql --with-unix-socket-path=/home/hogehoge/public_html/senna/bin/mysql/tmp/mysql.sock --with-tcp-port=3366 --with-mecab=/home/hogehoge/public_html/senna/bin/mecab --with-senna=/home/hogehoge/public_html/senna/bin/senna/
■Mysql起動
 mkdir tmp var data
  chown mysql tmp var data
  
  ../bin/mysql_install_db --basedir=/home/hogehoge/public_html/senna/bin/mysql --datadir=/home/hogehoge/public_html/senna/bin/mysql/data/ --user=mysql --srcdir=/home/hogehoge/public_html/senna/source/mysql-5.0.51-tritonn-1.0.8

  ./bin/mysqld_safe --defaults-file=../etc/my.cnf --user=mysql

DBログイン
mysql -u root --socket=/home/hogehoge/public_html/senna/bin/mysql/tmp/mysql.sock

DB作成
create database hoge;
use hoge;

テーブル作成
create table articles(id INT PRIMARY KEY, body TEXT) DEFAULT CHARSET utf8 ENGINE = MyISAM;

全文検索用インデックス作成
CREATE FULLTEXT INDEX fulltext_index ON articles(body);
■SQL検索
データ登録
SET NAMES utf8;
INSERT INTO articles (id, body) VALUES(1, "今日の天気は晴れです。");
INSERT INTO articles (id, body) VALUES(2, "明日の天気は雨です。");

データ検索(ある単語を含むレコードを抽出)
SELECT id,body,MATCH(body) AGAINST('晴れ' IN BOOLEAN MODE) as score FROM articles order by score;


データ検索(単語による重み付けし、スコア順に並び替え)
SELECT id,body,MATCH(body) AGAINST('+天気 >雨 <明日 <晴れ' IN BOOLEAN MODE) as score FROM articles order by score;


補足:IN BOOLEAN MODEを指定しないと、ヒット件数が全体の50%を超える結果の場合は何も返してくれなくなるので付ける