[Senna-dev 529] Re: スニペット機能について

Back to archive index

Tasuku SUENAGA a****@razil*****
2007年 3月 29日 (木) 15:32:59 JST


末永です。

現在、MySQLでのsnippet機能は検索部分と全く連携していません。

よって、ご指摘のようにIFで切り替えてもらうか、
もしくはconcatで連結してもらえると希望の結果が得られると思います。

concatは、
 select snippet(concat(c1, c2), 100, 1, 'ujis', 1,
                '...','...</br>','東京','<b>','</b>') as sni
でも、
 select concat(snippet(c1, 100, 1, 'ujis', 1,
                '...','...</br>','東京','<b>','</b>'),
               snippet(c2, 100, 1, 'ujis', 1,
                '...','...</br>','東京','<b>','</b>')) as sni
でもよいとは思いますが、
前者のほうがパフォーマンスが発揮されると思います。

c2の結果にc1の結果のゴミが混じる場合には、
concat(c1, ' 'をいっぱい, c2)
として、得られた結果からスペースを削ったりするとよいと思います。

いずれの方法も強引だとは思いますが…

Tatsuya Uemura wrote:
> お世話になります。
> 上村と申します。
> 
> tritonn-1.0.1+mysql-5.0.37+senna-1.0.3を使用しているのですが、
> スニペット機能ついてご相談させて下さい。
> 
> 複数カラムにFULLTEXT INDEXを使用した場合の動作についてなのですが。
> 
> CREATE TABLE t2 (c1 TEXT,c2 TEXT, FULLTEXT INDEX ft USING NGRAM (c1,c2)) ENGINE = MyISAM DEFAULT CHARSET ujis;
> 
> INSERT INTO t2 VALUES ("すもももももももものうち","あああああ");
> 
> INSERT INTO t2 VALUES ("生麦生米生卵","いいいいい");
> 
> INSERT INTO t2 VALUES ("東京特許許可局","うううううう");
> 
> mysql> select snippet(c1, 100, 1, 'ujis', 1,'...','...</br>','東京','<b>','</b>')as sni FROM t2 WHERE MATCH(c1,c2) AGAINST('東京');
> +----------------------------------+
> | sni                              |
> +----------------------------------+
> | ...<b>東京</b>特許許可局...</br> |
> +----------------------------------+
> 1 row in set (0.00 sec)
> 
> 上記はいいのですが、
> 
> mysql> select snippet(c2, 100, 1, 'ujis', 1,'...','...</br>','東京','<b>','</b>')as sni FROM t2 WHERE MATCH(c1,c2) AGAINST('東京');
> +-----+
> | sni |
> +-----+
> |     |
> +-----+
> 1 row in set (0.01 sec)
> 
> となります。
> 当たり前と言えばそうなのですが、何かいい解決案はありますでしょうか?
> 又、スニペット機能を複数カラムにINDEXを張って使うと言うのがそもそもNGで
> しょうか?
> 
> 以下の様な結果が帰ってくればありがく思っておりますが、
> mysql> select snippet(c1, 100, 1, 'ujis', 1,'...','...</br>','東京','<b>','</b>')as sni FROM t2 WHERE MATCH(c1,c2) AGAINST('東京');
> +----------------+
> | sni            |
> +----------------+
> | 東京特許許可局 |
> +----------------+
> 
> 以下の感じで強引にやるしかないでしょうか?
> mysql> select case when length(snippet(c1, 100, 1, 'ujis', 1,'...','...</br>','うう','<b>','</b>'))!=0 then snippet(c1, 100, 1, 'ujis', 1,'...','...</br>','うう','<b>','</b>') else c1 end sni FROM t2 WHERE MATCH(c1,c2) AGAINST('うう');
> +----------------+
> | sni            |
> +----------------+
> | 東京特許許可局 |
> +----------------+
> 
> どうでしょうか?ご意見頂ければ
> よろしくお願いいたします。
---
Tasuku SUENAGA <a****@razil*****>




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