[pgsql-jp: 37957] Re: インデックスGIN利用時tsearch2 でのNOT検索エラー(PostgreSQL v8.2.1)

Tatsuo Ishii ishii @ sraoss.co.jp
2007年 1月 21日 (日) 19:16:10 JST


石井です.

> この場合、全文検索を目的としたテキストボックスがあり、誰でも自由に検索できるような仕組み(Namazuのような)を作成する場合は全スキャンになるような
> 問い合わせをプログラム側で判断してクエリーを工夫するしかなさそうな気がします。
> 
> 上記の場合は「test以外」とう内容で入力された場合は
> SELECT * FROM sample WHERE idxfti @@ to_tsquery('!test')ではなく
> SELECT * FROM sample WHERE NOT idxfti @@ to_tsquery('test')というように・・・。

そうですね.

> ただ、確実に全スキャンになるクエリーだとプログラム側で判別できるもの
> なんでしょうか?

querytree()というtsearch2付属の関数を使って判断できるようです.

test=# select querytree('foo'::tsquery);
 querytree 
-----------
 'foo'
(1 row)

test=# select querytree('!test'::tsquery);
 querytree 
-----------
 T
(1 row)

test=# select querytree('foo | !test'::tsquery);
 querytree 
-----------
 T
(1 row)

'T'が返ってきたら,まずいと.

その他,問い合わせ文字列が''(空文字列)も駄目なようです.

NOTICE:  tsearch query doesn't contain lexeme(s): ""
ERROR:  GIN index does not support search with void query

こんなエラーになります.これもquerytreeで事前にチェックできます.

test=# select querytree(''::tsquery);
NOTICE:  tsearch query doesn't contain lexeme(s): ""
 querytree 
-----------
 
(1 row)

NOTICEは出ちゃいますが...

> それともかなり頻繁にANALYZEを実行しておくとか?
> でも更新頻度の高いテーブルの場合ANAYZEの発行間隔内にクエリーを実行さ
> れた場合エラーになる可能性もあるような気がします。

? ANALYZEの頻度は関係ないような気がしますが...

> つまりまだ安定して利用したいならtsearch2+GiSTという組み合わせを選択すべきということなのでしょうね。
> 
> しかし、tsearch2+GINの検索スピードには魅力があります・・・。

そうですね.ちょっと今の仕様では不便なので,改善を開発元にお願いしたい
ですね.本家MLでディスカッションしてみます.
--
Tatsuo Ishii
SRA OSS, Inc. Japan



pgsql-jp メーリングリストの案内