高見 直輝
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