mroongaでgroongaの前方一致検索を使うには

More than 3 years have passed since last update.

いよいよ、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に興味をもったら、まずはインストールしてみてください。

動作を知りたいというのであれば、ユーザーガイドもあります。