6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-02

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

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?