[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 メーリングリストの案内