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

Back to archive index

高見 直輝 takam****@orega*****
2016年 1月 21日 (木) 14:37:13 JST


高見です。

> > @@演算子を使用してGROONGAの等価条件と不等価条件をそれぞれ行
> > おうとしているのですが、意図した結果になりません。
> > http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html#equal-condition
> 
> http://pgroonga.github.io/ja/reference/operators/query.html
>> 
> > カラム名:@キーワードのようにカラム名:から始まる構文を使う
> > ことはできません。これはPGroongaで無効にしています。

すいません、見落としていました。
この記述、チュートリアルのページにも書いておいた方がいいと思います。

> と書いているのですが、@@演算子では等価条件・不等価条件を使う
> ことはできません。等価条件は=演算子を使ってください。
> 
> 不等価条件は。。。<>演算子を使うと、PostgreSQLが内部で=演算
> 子を使って実現してくれるかもしれません。ちょっと試していない
> のですぐにはわからないです。
> 
> > テーブル定義などは[groonga-dev,03855]と同じです。
> 
> 等価条件(つまり完全一致検索)は全文検索とは違うインデックス
> を作成する必要があります。具体的にはvarchar型にしてインデッ
> クスを作成してください。
> 
> http://pgroonga.github.io/ja/tutorial/#equal-string

これは、インデックス定義内のカラム型で判別しているのでしょうか?
lower関数などを使用する場合、自動的にTEXTに変換されるので対応できなくな
るようです。
当方の現状からすると、インデックスの追加又は再作成はハードルが高いので
TEXT列に対して完全一致が出来るようになると助かるのですが、今後、可能にす
る予定はありますでしょうか?

> > CREATE TABLE tags (
> >   id integer,
> >   tag varchar(1023)
> > );
> >
> > CREATE INDEX pgroonga_tag_index ON tags USING pgroonga (tag);
> 
> > テーブルには以下のレコードが存在しています。
> > "\st","新しいフォルダー"
> > "\st","新しいフォルダー\desktop.ini"
> > "\st","00201-00300"
> 
> > まずは等価条件から。
> > 先述のレコードの中から、『"\st","新しいフォルダー"』のみを取得するため、
> > 以下のSQLを実行しました。
> > select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
> >  where lower(pathcombine(rootdir,path)) @@ '"\\st\\新しいフォルダー"';
> > この結果、以下のレコードが取得されました。
> > \st\新しいフォルダー\desktop.ini
> > \st\新しいフォルダー
> 
> これは「\st\新しいフォルダー」で全文検索をしていることになる
> ので「\st\新しいフォルダー」を含む↑のレコードがヒットしてい
> ます。
> 
> > 次に、不等価条件を。
> > 『"\st","00201-00300"』のみを取得するため、以下のSQLを実行しました。
> > select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
> >  where lower(pathcombine(rootdir,path)) @@ '!"\\st\\新しいフォルダー"';
> > この結果は0件でした。
> 
> これは「!\st\新しいフォルダー」で全文検索をしていることにな
> るので「!\st\新しいフォルダー」を含むレコードがなく、0件ヒッ
> トとなっています。
> 
> > なお、各SQLを実行したときにPGROONGAのデバッグログに何も出力されませんで
> > した。
> > これは、そもそもPGROONGAのインデックスが使われていないということなのでしょ
> > うか?
> 
> それは妙ですね。検索条件に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\新しいフォルダー');
とした場合はデバッグログに出力されるのですが・・・。

----------------------------- 
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180




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