以前の記事(MySQLで全文検索できるって!?)で、id:tomyheroさんからMySQLの日本語全文検索は無理だからSennaで出来るよと教えてもらったので、やってみた。
基本的に構築系の作業は、自分の作業ログをメモ帳に記入しているんだけど、まとめるのが面倒でブログにそれを投稿してこなかったけど、これからは少しずつ溜まっているメモ書きをブログにアップしよう。
Sennaは日本語の字句解析のmecabを使って単語に分けて登録し、それを元に全文検索を行う。MySQLにsennaを組み込み、MySQLの関数をラッピングするのにtritonというものを使う。これはMySQLにパッチを当てたものです。
今回は、自分のホームディレクトリにsenna、mecab、mecab辞書、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%を超える結果の場合は何も返してくれなくなるので付ける