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

Zurück zum Archiv-Index

Kouhei Sutou kou****@clear*****
2016年 1月 20日 (水) 22:06:06 JST


須藤です。

In <20160****@orega*****>
  "[groonga-dev,03865] PGROONGAでの等価条件&不等価条件の指定方法" on Wed, 20 Jan 2016 10:23:55 +0900,
  高見 直輝 <takam****@orega*****> wrote:

> @@演算子を使用して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

> 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\\新しいフォルダー"');

としてもデバッグログになにも出力されないんですよね?
同じスキーマで同じ検索条件で、文字列だけ変えているのにでない
のはおかしい気がします。

-- 
須藤 功平 <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 メーリングリストの案内
Zurück zum Archiv-Index