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