[groonga-dev,03871] Re: PGROONGAでの等価条件&不等価条件の指定方法

Back to archive index

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




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