mysql: 全文検索エンジンを使ってみる : senna/Tritonnの利用
ここのwordpressも全文検索エンジン入れたらきっと速くなると近いつつ、インストールしてみました。インストールは意外と簡単(むしろ調べるのに時間がかかったかな?)でした。そもそもsennaって何?なんですが、sennaサイトの文言をそのまま引用しておきます。
sennaは組み込み型の全文検索エンジンです。DBMSやスクリプト言語処理系等に組み込むことによって、その全文検索機能を強化することができます。 n-gramインデックスと単語インデックスの特徴を兼ね備えた、高速かつ高精度な転置インデックスタイプのエンジンです。コンパクトな実装ですが、大規 模な文書量と検索要求を処理できるよ うに設計されています。また、純粋なn-gramインデックスの作成も可能です。
実際MySQLでも標準で全文検索エンジンはついておりますが、あえてsennaを入れてみたのは・・・。上司からの依頼ってだけで、たいした理由はないです(汗 でも簡単につかってみて、これは色々使えそうだな?と感じましたよ。 では、さっそくインストール方法について掲載します。
senna,セナ、せなって書きましたが実際こちらで説明するのは、MySQL バインディングの方法です。そのバインディングプロジェクトを、Tritonn (トリトン、トライトン)といいます。こちらの内容もサイトそのまま引用しますが
TritonnはMySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトです。以前はMySQLに当てるパッチを開発するプロジェクトでしたが、現在は1歩進めてMySQLの改造版ソースを開発するプロジェクトとして活動しています。
ですです。
インストール方法
- 必要ファイル 以下のサイトからダウンロードできます。 http://sourceforge.jp/projects/tritonn/releases/
[shell] MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm mecab-0.98-tritonn.1.0.12a.x86_64.rpm mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm senna-1.1.4-tritonn.1.0.12a.x86_64.rpm [/shell]
- インストール [shell] yum install perl yum install perl-DBI cd /usr/local/src rpm -ivh mecab-0.98-tritonn.1.0.12a.x86_64.rpm rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm rpm -ivh senna-1.1.4-tritonn.1.0.12a.x86_64.rpm rpm -ivh MySQL-* [/shell]
MySQL 環境設定
- mysqlの起動
[shell]
/etc/init.d/mysql start
/sbin/chkconfig mysql on
/etc/init.d/mysql stop
cp /usr/share/mysql/my-large.cnf /etc/my.cnf
[/shell]
- my.cnfの設定 [shell] skip-character-set-client-handshake default-character-set = utf8 character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 [/shell]
初回設定
h3. mysqlの確認
文字コード [shell] mysql> show variables like "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ [/shell]
engine [shell] mysql> show engines; +------------+----------+----------------------------------------------------------------+ | Engine | Support | Comment | +------------+----------+----------------------------------------------------------------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | | BerkeleyDB | NO | Supports transactions and page-level locking | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | | EXAMPLE | YES | Example storage engine | | ARCHIVE | YES | Archive storage engine | | CSV | YES | CSV storage engine | | ndbcluster | DISABLED | Clustered, fault-tolerant, memory-based tables | | FEDERATED | DISABLED | Federated MySQL storage engine | | MRG_MYISAM | YES | Collection of identical MyISAM tables | | ISAM | NO | Obsolete storage engine | +------------+----------+----------------------------------------------------------------+ [/shell]
ユーザー情報の作成 [shell] delete from mysql.user where password = '';
set password for root@localhost=password('senna'); set password for root@127.0.0.1=password('senna');
grant all privileges on . to root@'192.168.0.0/255.255.255.0' IDENTIFIED BY 'senna';
grant SELECT,INSERT,UPDATE,DELETE on . to srdsys@'localhost' IDENTIFIED BY 'senna'; grant SELECT,INSERT,UPDATE,DELETE on . to srdsys@'127.0.0.1' IDENTIFIED BY 'senna';
grant SELECT on . to srdusr@'localhost'IDENTIFIED BY 'senna'; grant SELECT on . to srdusr@'127.0.0.1' IDENTIFIED BY 'senna'; [/shell]
- 設定が反映されているか確認する [shell] select user,host,password from mysql.user order by user,host; [/shell]
h3. senna 検証
- mysqlにログインする [shell] mysql -u root -psenna create database sennadb; use sennadb; [/shell]
- NGRAMインデックスの作成 [shell] CREATE TABLE tngram ( id INTEGER AUTO_INCREMENT, PRIMARY KEY (id), yubin char(10) NOT NULL, add1 TEXT NOT NULL, add2 TEXT NOT NULL, add3 TEXT NOT NULL, FULLTEXT INDEX USING NGRAM, SECTIONALIZE (add1,add2,add3) );
設定確認
show create table tngram;
CREATE TABLE tngram
(
id
int(11) NOT NULL auto_increment,
yubin
char(10) NOT NULL,
add1
text NOT NULL,
add2
text NOT NULL,
add3
text NOT NULL,
PRIMARY KEY (id
),
FULLTEXT KEY add1
USING NGRAM, NORMALIZE, SECTIONALIZE, 512 (add1
,add2
,add3
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
[/shell]
* テストデータ投入
[shell]
mysql sennadb -u root -psenna < /tmp/address.sql
[/shell] * 検索の検証 [shell]
スコアを表示してみる。
mysql> select match(add1,add2,add3) against("新宿") as score, add1,add2,add3 from tngram where match(add1,add2,add3) against("新宿") limit 10; +-------+-----------+-----------+--------------------------------+ | score | add1 | add2 | add3 | +-------+-----------+-----------+--------------------------------+ | 1 | 東京都 | 葛飾区 | 新宿 | | 1 | 東京都 | 新宿区 | 以下に掲載がない場合 | | 1 | 東京都 | 新宿区 | 愛住町 | | 1 | 東京都 | 新宿区 | 赤城下町 | | 1 | 東京都 | 新宿区 | 赤城元町 | | 1 | 東京都 | 新宿区 | 揚場町 | | 1 | 東京都 | 新宿区 | 荒木町 | | 1 | 東京都 | 新宿区 | 市谷加賀町 | | 1 | 東京都 | 新宿区 | 市谷甲良町 | | 1 | 東京都 | 新宿区 | 市谷砂土原町 | +-------+-----------+-----------+--------------------------------+ 10 rows in set (0.00 sec) [/shell]
- 重みを付けて検索してみる [shell] mysql> SELECT * FROM tngram WHERE MATCH(add1,add2,add3) AGAINST("*W1,2 新宿" IN BOOLEAN MODE) limit 10; +------+---------+-----------+-----------+--------------------------------+ | id | yubin | add1 | add2 | add3 | +------+---------+-----------+-----------+--------------------------------+ | 1343 | 1600000 | 東京都 | 新宿区 | 以下に掲載がない場合 | | 1344 | 1600005 | 東京都 | 新宿区 | 愛住町 | | 1345 | 1620803 | 東京都 | 新宿区 | 赤城下町 | | 1346 | 1620817 | 東京都 | 新宿区 | 赤城元町 | | 1347 | 1620824 | 東京都 | 新宿区 | 揚場町 | | 1348 | 1600007 | 東京都 | 新宿区 | 荒木町 | | 1349 | 1620062 | 東京都 | 新宿区 | 市谷加賀町 | | 1350 | 1620856 | 東京都 | 新宿区 | 市谷甲良町 | | 1351 | 1620842 | 東京都 | 新宿区 | 市谷砂土原町 | | 1352 | 1620846 | 東京都 | 新宿区 | 市谷左内町 | +------+---------+-----------+-----------+--------------------------------+ 10 rows in set (0.00 sec) [/shell]