[Senna-dev 664] NGRAM での英数字の部分一致検索について

Back to archive index

ym_sabn-****@yahoo***** ym_sabn-****@yahoo*****
2007年 8月 30日 (木) 17:21:03 JST


お世話になっております。井上です。
表題の件について質問させてください。

CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
INSERT INTO t1 VALUES ("FedoraCore500の技");

という状態で、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500");

と検索するとヒットするのですが、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00");
や
SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core");

と検索するとヒットしませんでした。
英数字に限り単語単位に分けているのかなと思い、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Fedo");

と試してみたのですが、これはヒットします。また、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("50");

もヒットします。
純粋にNGRAM化されているのであれば「Core」や「00」でも
ヒットすると思っていましたので少々意外でした。

また、非正規化(NO NORMALIZE)を付けて試してみたのですが、
その場合には、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("00");
SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core");

の両方ともヒットいたします。
私の方での使用用途でのお話で恐縮ですが、「00」や「Core」
もヒットする方がしっくりくるようなサービスの予定ですので、
何かよい手はないかと困っております。

#例えば「DiningBar ルイーダの酒場」なんてお店があった場合、
#「Bar」で検索してもヒットして欲しい、といったような…。

非正規化のオプションを付けると当然ながら今度は、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("500");

と全角で検索するとヒットしなくなりますのでこれも避けたく
思っています。
#アプリケーションレイヤーで対応できる内容ではありますが。


と、色々試してみまして、正規化と非正規化でいったいどのような
差が出るのか、また、正規化を生かした状態で、

SELECT * FROM t1 WHERE MATCH(c1) AGAINST("Core");

をヒットさせる方法はないのか、といった点をご教授いただけ
ないでしょうか。


バージョンは、下記のとおりです。
senna-1.0.8
mysql-5.0.45-tritonn-1.0.4


以上、お手数をおかけしますが何卒よろしくお願いいたします。




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