いよいよ、gihyo.jpさんでgroongaの隔週更新連載が始まりました!!
第2回の記事も公開されたので、一読をおすすめします。
連載は始まりましたが、利用事例をどんどん紹介していきたいです。groongaやmroonga、rroongaを実際に使っていて、利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細はgroonga普及のための協力のお願いを参照してください。
はじめに
MySQLで高速に全文検索するためのオープンソースのストレージエンジンとしてmroongaを公開しています。
この記事を書いた時の最新のバージョンは2013年4月29日にリリースした3.03です。
今回は、mroongaでgroongaの前方一致検索を使う方法を紹介します。
mroongaにおける全文検索用のパーサ指定
mroongaではコメントを用いた独自の構文で全文検索用のパーサを指定することができます。
また、パーサだけでなくノーマライザーもコメントで指定することができます。
例えば、パーサにTokenMecab
を利用したい場合には以下のようにコメントで指定します。
FULLTEXT INDEX (content) COMMENT 'parser "TokenMecab"'
指定できるパーサについては全文検索用のパーサの変更を参照してください。
3.03からはパーサの指定を明示的に無効にすることができるようになりました。
無効にする場合は、コメントで以下のように指定します。
FULLTEXT INDEX (content) COMMENT 'parser "off"'
パーサを無効にした状態での前方一致検索
では、パーサを無効にできるとどのような利点があるのでしょうか。
実際の例で試してみましょう。
サンプルとして使うスキーマは以下の通りです。
CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT,
content varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
content2 varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
PRIMARY KEY (id),
FULLTEXT INDEX content (content) COMMENT 'parser "off"',
FULLTEXT INDEX content2 (content2)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
テスト用のテーブルに一方はパーサを無効にしたカラムのcontent
を用意し、もう一方はパーサを特に指定しないカラムcontent2
を用意します。
サンプルとして使うデータは以下の通りです。
INSERT INTO test (content, content2) VALUES ('とらっく', 'とらっく');
INSERT INTO test (content, content2) VALUES ('とらっくばっく', 'とらっくばっく');
INSERT INTO test (content, content2) VALUES ('東京都', '東京都');
INSERT INTO test (content, content2) VALUES ('京都', '京都');
では、上記のデータでパーサを無効にしたcontent
カラムに対して前方一致検索してみましょう。
SELECT * FROM test WHERE MATCH(content) AGAINST('とらっく*' IN BOOLEAN MODE);
期待通りにとらっくばっく
ととらっく
が結果に含まれています。
id content content2
2 とらっくばっく とらっくばっく
1 とらっく とらっく
では、デフォルトのパーサが適用されるcontent2
カラムに対して前方一致検索してみましょう。
SELECT * FROM test WHERE MATCH(content2) AGAINST('とらっく*' IN BOOLEAN MODE);
この結果は0件となり、とらっくばっく
にもとらっく
にもヒットしません。
これはデフォルトのパーサがバイグラムでトークナイズしているためです。
何も指定しないと、TokenBigram
を指定した場合と同じになります。
前方一致検索でデフォルト設定によりトークナイズした結果がインデックスとして使われてしまうと、期待した結果を得られません。
同様の理由で、パーサを無効にしないと東京*
ならヒットしますが東京都*
だとヒットしないということになります。
このような場合に、パーサを明示的に無効にできると意義があります。
これまでもパーサにTokenDelimitNull
を指定すれば似たようなことはできましたが、カラムにnull文字が含まれていないことを担保する必要がありました。
まとめ
今回はmroongaでgroongaの前方一致検索を使う方法を紹介しました。
ノーマライザーも一緒に指定できるようになったので、NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark
も指定すれば、utf8_unicode_ci
を使いつつも、濁点は区別して全文検索を行うことができたりします。
mroongaに興味をもったら、まずはインストールしてみてください。
動作を知りたいというのであれば、ユーザーガイドもあります。