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

Back to archive index

ym_sabn-****@yahoo***** ym_sabn-****@yahoo*****
2007年 8月 30日 (木) 18:22:58 JST


お世話になっております。井上です。

>島村様
> > Sennaのソースコードlib/lex.cの
> >
> >   44   lex->uni_alpha = (nstr->ctypes && !(lex->sym->flags & SEN_INDEX_SPLIT_ALPHA));
> >   45   lex->uni_digit = (nstr->ctypes && !(lex->sym->flags & SEN_INDEX_SPLIT_DIGIT));
> >   46   lex->uni_symbol = (nstr->ctypes && !(lex->sym->flags & SEN_INDEX_SPLIT_SYMBOL));
> >
> > 辺りをコメントアウトすると可能です。

試してみました。
バッチリです!希望通りの結果となりました!
ありがとうございました!


>池田様
> となるとUSING句をもうちょい拡張して対応、というのが良さそうですね。
> 今後のロードマップに入れさせていただきます。

はい!ぜひよろしくお願いいたします!
#島村様の方法でうまくはいきましたが、やはりソースに手を
#加えるのは抵抗がありますので… ^^;


以上、ありがとうございました! m(_ _)m


--- Tetsuro IKEDA <ikdtt****@gmail*****> wrote:

> こんにちは。池田@tritonnです。
> 
> となるとUSING句をもうちょい拡張して対応、というのが良さそうですね。
> 今後のロードマップに入れさせていただきます。
> 
> 07/08/30 に Yutaro Shimamura<yu****@irx*****> さんは書きました:
> >
> > こんにちは。島村です。
> >
> > SEN_INDEX_SPLIT_ALPHAやSEN_INDEX_SPLIT_DIGITフラグを
> > インデックス作成時につけることによって、
> > 文字数ごとの分割が可能になります。
> >
> > 今のトリトンでは指定できなかったような気がしますが、
> > Sennaのソースコードlib/lex.cの
> >
> >   44   lex->uni_alpha = (nstr->ctypes && !(lex->sym->flags &
> > SEN_INDEX_SPLIT_ALPHA));
> >   45   lex->uni_digit = (nstr->ctypes && !(lex->sym->flags &
> > SEN_INDEX_SPLIT_DIGIT));
> >   46   lex->uni_symbol = (nstr->ctypes && !(lex->sym->flags &
> > SEN_INDEX_SPLIT_SYMBOL));
> >
> > 辺りをコメントアウトすると可能です。
> >
> > (インデックス作成からやり直す必要がありますが)
> >
> >
> > On Aug 30, 2007, at 5:21 PM, <ym_sabn-****@yahoo*****> <ym_sabn-
> > mysql****@yahoo*****> wrote:
> >
> > > お世話になっております。井上です。
> > > 表題の件について質問させてください。
> > >
> > > 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 mailing list
> > > Senna****@lists*****
> > > http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> >
> > -------
> > 島村 優太郎
> > yu****@irx*****
> >
> > _______________________________________________
> > Senna-dev mailing list
> > Senna****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> >
> 
> _______________________________________________
> Senna-dev mailing list
> Senna****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> 




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