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
以上、お手数をおかけしますが何卒よろしくお願いいたします。