Kouhei Sutou
kou****@clear*****
2016年 1月 22日 (金) 00:43:16 JST
須藤です。 In <20160****@orega*****> "[groonga-dev,03870] Re: PGROONGAでの等価条件&不等価条件の指定方法" on Thu, 21 Jan 2016 14:37:13 +0900, 高見 直輝 <takam****@orega*****> wrote: >> 等価条件(つまり完全一致検索)は全文検索とは違うインデックス >> を作成する必要があります。具体的にはvarchar型にしてインデッ >> クスを作成してください。 >> >> http://pgroonga.github.io/ja/tutorial/#equal-string > > これは、インデックス定義内のカラム型で判別しているのでしょうか? はい、そうです。 Groongaではインデックスのキーは最長4KiBになっています。text 型は長さの制限がないため、インデックスを使った完全一致検索を できない値がでてしまいます。そのため、varchar型で最大4KiBに なる場合だけ使えるようにしています。 > 当方の現状からすると、インデックスの追加又は再作成はハードルが高いので > TEXT列に対して完全一致が出来るようになると助かるのですが、今後、可能にす > る予定はありますでしょうか? 前述の通り、サイズ制限があるためサポートする予定はありません。 (うまい落とし所が見つかればサポートするかもしれませんが。。。) 代わりにLIKEを使うのはいかがでしょうか? lower(pathcombine(rootdir,path)) LIKE lower('\\st\\新しいフォルダー') とすると、すでにある全文検索用のインデックスを使いながら完全 一致検索を実現します。完全一致用のインデックスを使うよりも処 理量が増えるので遅くなりますが、サイズ制限はありません。 (クエリーの前後に「%」をつけていないことがポイントです。) >> それは妙ですね。検索条件にlower()をつけて >> >> select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE >> where lower(pathcombine(rootdir,path)) @@ lower('"\\st\\新しいフォルダー"'); >> >> としてもデバッグログになにも出力されないんですよね? > > その通りです。 > >> 同じスキーマで同じ検索条件で、文字列だけ変えているのにでない >> のはおかしい気がします。 > > 上記のSQLで > select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE > where lower(pathcombine(rootdir,path)) %% lower(\st\新しいフォルダー'); > とした場合はデバッグログに出力されるのですが・・・。 うーん、手元でも試せるとなにかわかりそうな気がするのです が。。。pathcombine()を抜いても再現しますか? もし、そうならPostgreSQLの標準機能だけで実現できると思うので、 同じサンプルデータを使えれば手元でも試せる気がしています。 -- 須藤 功平 <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