[groonga-dev,03861] Re: PGROONGAの@@コマンドでの前方一致検索

Back to archive index

Kouhei Sutou kou****@clear*****
2016年 1月 18日 (月) 23:52:37 JST


須藤です。

In <20160****@orega*****>
  "[groonga-dev,03860] Re: PGROONGAの@@コマンドでの前方一致検索" on Mon, 18 Jan 2016 15:36:28 +0900,
  高見 直輝 <takam****@orega*****> wrote:

>> > select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
>> >  where
>> >    lower(pathcombine(rootdir,path)) LIKE lower('\st\新しいフォルダー\フォルダ%') AND
>> >    lower(pathcombine(rootdir,path)) @@ lower('"30"');
>> > 
>> > で同じ挙動になるんじゃないかと思います。
>> 
>> 残念ながら、改善しませんでした。
>> どうも、LIKE指定が在ると無条件で結果が0件になって居るような感じです。

すみません。
LIKEの中ではバックスラッシュは特別な文字なのでエスケープしな
いといけませんでした。

なので、書き方は

> 最後に、LIKE検索で\をエスケープした結果です。(結果:0件)
> select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
>  where
>    lower(pathcombine(rootdir,path)) LIKE lower('%\\st\\新しいフォルダー\\フォルダ%') AND
>    lower(pathcombine(rootdir,path)) @@ lower('"30"');

が正しいです。

PGroongaのログをみるとGroongaレベルではヒットしていそうなの
で、PostgreSQLがrecheckしているときにレコードが減っているの
ではないかと思います。

EXPLAIN ANALYZE VERBOSE
select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
 where
   lower(pathcombine(rootdir,path)) LIKE lower('%\\st\\新しいフォルダー\\フォルダ%') AND
   lower(pathcombine(rootdir,path)) @@ lower('"30"');


すると

  Rows Removed by Index Recheck: XXX

みたいなのがでていると思います。

recheckするときはシーケンシャルスキャンになります。シーケン
シャルスキャンのときは「@@」はPGroongaの「@@」ではなく
PostgreSQLが提供している「@@」(*)が使われます。

(*) https://www.postgresql.jp/document/9.4/html/functions-textsearch.html

これだと

  lower(pathcombine(rootdir,path)) @@ lower('"30"')

はマッチしません。

これは演算子の検索順序の問題で、pgroongaスキーマにある演算子
をpg_catalogスキーマより検索するようにすればよいです。そうす
ればシーケンシャルスキャンの時もPGroongaの「@@」が使われるか
らです。具体的にはこうします。

  SET search_path = "$user",public,pgroonga,pg_catalog;

ドキュメントに説明を。。。まだ書いていませんでした。。。
  http://pgroonga.github.io/ja/reference/operators/query.html#sequential-scan


もともと、PostgreSQLと同じ演算子を使った方が既存のPostgreSQL
ユーザーになじみがあって使いやすいだろうと思っていたのですが、
実際は↑のような罠があるので、将来的に演算子を変えようと思っ
ています。今考えているのは、ぜんぶ最初に「&」をつけて「&@」
とか「&%」とか「&~」とかを考えています。最初に「&」を使って
いる演算子が少なそうだからというのと、「&」はちょっと「G」に
似てい。。。なくもないからです。

>> 一つ確認なのですが、1.0.1を適用することで状況が改善する可能性はあります
>> でしょうか?
>> 現在1.0.0で動かしています。

残念ながら変わらないと思います。

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
リーダブルコードワークショップ:
  http://www.clear-code.com/services/code-reader/readable-code-workshop.html




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