[groonga-dev,03796] Re: pgroongaのlikeと@~の動作について

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 12月 23日 (水) 18:43:59 JST


須藤です。

In <CA+Tq-Rqdf7kHG7H=EkrWx=hB_6L05JSSr9Cf99R4j=tWBci****@mail*****>
  "[groonga-dev,03792] pgroongaのlikeと@~の動作について" on Mon, 21 Dec 2015 10:06:37 +0000,
  Hiroyuki Sato <hiroy****@gmail*****> wrote:

> pgroongaの質問です。
> サンプルをここに掲載しました。
> https://github.com/hiroyuki-sato/pgroonga_like_test

ありがとうございます!サンプルがあってとても助かります!

> 1, likeのSQL
> 
> 下記のSQLでpgroongaのインデックスが使われないようなのですが
> これはそういうものなのでしょうか?
> (7.1: クエリ1をごらんください)

これだとそういうものです。

というのは、PostgreSQLではvarcharに対してLIKEを使えないから
です。PostgreSQLは、varcharに対してLIKEを使うように言われた
ときは、textにキャストしてから実行します。つまり、インデック
ス構築時の値とは違う値(中身は同じだけど型は違う)で検索して
いるのでインデックスを使えないということです。

create table url_lists (
  id int not null primary key,
  url text not null
);

なので、というようにtextを使うようにするとインデックスを使え
るようになります。

そして、textの場合は

create index
  ix_url_url_lists2
on
  url_lists
using
  pgroonga(url pgroonga.varchar_regexp_ops);

はおかしい(urlがtextなのにvarchar用のoperator classを使おう
としている)ので消してください。

また、

create index
  ix_url_url_lists
on
  url_lists
using
  pgroonga(url)
with
  (tokenizer='TokenRegexp', normalizer='');

は、動くには動くんですが、正規表現のメリットを活かせないので、

create index
  ix_url_url_lists
on
  url_lists
using
  pgroonga(url pgroonga.text_regexp_ops);

の方がいいです。

> 2, JOIN Filter
> 上記のクエリプランをみると、Join FilterでURLのフィルタリングがされてい
> るようです。
> Join filterはpgroongaのインデックスを参照するのでしょうか?

参照しないです。
シーケンシャルに処理します。

> 3, @~の検索
> 
> 次のSQLですが、検索が0件になってしまいます。
> http://aa\.yahoo\.co\.jp/だとちゃんと結果がでるのですが、
> これはなぜなのでしょうか?、「.」は任意の一文字にマッチする
> と考えれば、正規表現的には間違えていないように思えます。

これは、前述の通り、インデックスの張り方がおかしいのと、
PGroongaにバグがあったからです。(masterでは直しました。)


-- 
須藤 功平 <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