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