高見 直輝
takam****@orega*****
2016年 1月 19日 (火) 10:22:22 JST
高見です。 > 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 このパラメータって、ALTER DATABASE で定義すると問題あるでしょうか? > もともと、PostgreSQLと同じ演算子を使った方が既存のPostgreSQL > ユーザーになじみがあって使いやすいだろうと思っていたのですが、 > 実際は↑のような罠があるので、将来的に演算子を変えようと思っ > ています。今考えているのは、ぜんぶ最初に「&」をつけて「&@」 > とか「&%」とか「&~」とかを考えています。最初に「&」を使って > いる演算子が少なそうだからというのと、「&」はちょっと「G」に > 似てい。。。なくもないからです。 ・・・そこまでこじつけるなら@Gとかで良いような気がします。 > >> 一つ確認なのですが、1.0.1を適用することで状況が改善する可能性はあります > >> でしょうか? > >> 現在1.0.0で動かしています。 > > 残念ながら変わらないと思います。 了解しました。ありがとうございます。 ----------------------------- 高見 直輝 <takam****@orega*****> 株式会社オレガ TEL:03-3267-0150 FAX:03-3267-0180