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