[groonga-dev,01563] Re: mroongaでの部分一致検索について

Back to archive index

HAYASHI Kentaro hayas****@clear*****
2013年 8月 1日 (木) 17:53:25 JST


林です。

On Thu, 1 Aug 2013 15:59:34 +0900
三浦悟 <memor****@gmail*****> wrote:

> はじめまして、三浦と申します。
> 
> mroongaをストレージモードで利用しているのですが、半角英数での部分一致検索ができないようです。
> 
snip
> アルファベットには部分一致しません。
> mysql> select * from mytest where match(word) against('iu' IN BOOLEAN MODE);
> Empty set (0.00 sec)
> 
> 
> こちら文字種によらず部分一致させる方法がありましたらご教授いただけると助かります。

まず、ご質問の意図が「iuで検索しているのに'aiueo'がヒットしない」ということだとして回答します。

答えとしては部分一致させるにはトークナイザを例えばTokenBigramSplitSymbolAlphaに変更すればできます。

どうして変更するとうまくいくかを説明します。
ご提示いただいたように、mroonga_default_parserの値は TokenUnigramになっています。

TokenUnigramを使うと、連続したアルファベットは1つのトークンとして扱われます。
つまり'aiueo'はひとまとまりで扱われます。

検索時の照合ではトークンとしての'auieo'と'iu'がマッチしないということになり、
結果として上記のように部分一致しないということがおこります。

では、トークナイザをTokenBigramSplitSymbolAlphaに変更するとどうなるかというと、
'aiueo'は'ai' 'iu', 'ue', 'eo'にBigramでトークナイズされるので、
トークンとしての'iu'にマッチするようになります。結果として'aiueo'にヒットします。

実際にどう変更するといいかというと、

変更前:

  FULLTEXT KEY `idx_word` (`word`)

変更後:

  FULLTEXT KEY `idx_word` (`word`) COMMENT 'parser "TokenBigramSplitSymbolAlpha"'

というようにCOMMENTでパーサを指定します。

つまり、変更後のスキーマはこうなります。

CREATE TABLE `mytest` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `word` varchar(128) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `idx_word` (`word`) COMMENT 'parser "TokenBigramSplitSymbolAlpha"'
) ENGINE=mroonga AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

すると、以下のように部分一致するようになります。

mysql> select * from mytest where match(word) against('iu' IN BOOLEAN MODE);
+----+-------+
| id | word  |
+----+-------+
|  4 | aiueo |
+----+-------+
1 row in set (0.00 sec)

とここまで書きましたが、もし、ご質問の意図が'iu'で'あいうえお'にも'aiueo'にも
マッチさせたいというのであれば、読みのカラム(例えばkanaなど)を用意してそちらを検索するのが
現実的かと思います。その際にはCOMMENTを指定し、トークナイズ方法には先ほど紹介した
TokenBigramSplitSymbolAlphaなどにしてください。

例えば、サンプルのスキーマは以下のような感じです。

CREATE TABLE `mytest` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `word` varchar(128) NOT NULL,
  `kana` varchar(128) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `idx_word` (`word`) COMMENT 'parser "TokenBigramSplitSymbolAlpha"',
  FULLTEXT KEY `idx_kana` (`kana`) COMMENT 'parser "TokenBigramSplitSymbolAlpha"'
) ENGINE=mroonga AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO mytest (word,kana) VALUES ("あいうえお","aiueo");
INSERT INTO mytest (word,kana) VALUES ("aiueo","aiueo");

mysql> select * from mytest where match(kana) against('iu' IN BOOLEAN MODE);
+----+-----------------+-------+
| id | word            | kana  |
+----+-----------------+-------+
|  3 | あいうえお      | aiueo |
|  4 | aiueo           | aiueo |
+----+-----------------+-------+
2 rows in set (0.01 sec)



-- 
HAYASHI Kentaro <hayas****@clear*****>




groonga-dev メーリングリストの案内
Back to archive index