高見 直輝
takam****@orega*****
2016年 1月 25日 (月) 10:40:17 JST
高見です。 > >> 等価条件(つまり完全一致検索)は全文検索とは違うインデックス > >> を作成する必要があります。具体的にはvarchar型にしてインデッ > >> クスを作成してください。 > >> > >> http://pgroonga.github.io/ja/tutorial/#equal-string > > > > これは、インデックス定義内のカラム型で判別しているのでしょうか? > > はい、そうです。 > > Groongaではインデックスのキーは最長4KiBになっています。text > 型は長さの制限がないため、インデックスを使った完全一致検索を > できない値がでてしまいます。そのため、varchar型で最大4KiBに > なる場合だけ使えるようにしています。 > > > 当方の現状からすると、インデックスの追加又は再作成はハードルが高いので > > TEXT列に対して完全一致が出来るようになると助かるのですが、今後、可能にす > > る予定はありますでしょうか? > > 前述の通り、サイズ制限があるためサポートする予定はありません。 > (うまい落とし所が見つかればサポートするかもしれませんが。。。) 文字列系の関数は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の標準機能だけで実現できると思うので、 > 同じサンプルデータを使えれば手元でも試せる気がしています。 インデックスを下記のもので再作成しても状況は変わりませんでした。 CREATE INDEX TEST_TABLE_path ON TEST_TABLE USING pgroonga (lower(path)) WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit', normalizer=''); EXPLAIN の結果を見ても、%%やLIKEではこのインデックスが使用されているの に、@@では使用されていません。 検索結果は%%と@@で同じ値が返ってきています。 ----------------------------- 高見 直輝 <takam****@orega*****> 株式会社オレガ TEL:03-3267-0150 FAX:03-3267-0180