[groonga-dev,03756] Re: PGroongaの基本的な質問

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 12月 12日 (土) 18:19:16 JST


須藤です。

In <CA+Tq-RqHXYUyEMixvA+3pxAsJGJjvSwQiu7Jo_ACvki****@mail*****>
  "[groonga-dev,03754] PGroongaの基本的な質問" on Fri, 11 Dec 2015 12:35:57 +0000,
  Hiroyuki Sato <hiroy****@gmail*****> wrote:

> PGroongaを使おうかと検討中です。

すばらしいです!

> 質問事項
> 
> 1, インデックスの保存場所
>   (1) groongaのデータはどこに保存されますか?

「${PGDATA}/${データベースのID}/」の下にpgrnからはじまるファ
イル名のファイルができます。それがGroongaのデータです。

>   (2) パスは変更可能でしょうか?
>   ・容量が大きくなりそうなのでPGDATA以外のパスに保存したいです。

変更できません。
変更できるようにすることはできます。

> 2, ASCIIだけでもpgroonga使った方がいいですよね?
>   ASCIIだけでも、pg_trigm, pg_bigmよりも速いでしょうか?

多くの場合で速いです。

>   http://slide.rabbit-shocker.org/authors/kou/postgresql-conference-2015/
>   17ページを見る限り、Groongaを使った方が良さそうですよね。

17ページというより、速いのはGroongaは完全転置インデックスだ
からです。完全転置インデックスだとインデックスを使った検索だ
けで正しい結果がわかるのでrecheckという処理(インデックスで
ヒットしたレコードが本当にヒットしたものかを検証するシーケン
シャルな処理)をしなくてもよくなります。そのため、多くの場合
でPGrongaの方が速いです。この傾向はヒット件数が多いほど顕著
になります。

> 3, パーティションテーブル(inheritされたデーブル)
> 
>   URLのデータは日別のパーティションテーブルに格納しています。
>   インデックスをかける場合は、継承したテーブル個々に
>   using groongaでインデックスを作成すれば良いでしょうか?

はい、そうです。

> 4, 完全一致
> 
> 完全一致の時もPGroongaのインデックスが使われますでしょうか?

インデックスを2種類作れば使えます。

完全一致を使うときはtextを使えません。サイズが4KiBを超えるか
もしれないからです。Groongaは1つのキーのサイズは最大で4KiBな
のでそれ以上のサイズのテキストはインデックスを使って完全一致
で探すことはできません。

なので、文字列を完全一致で検索する場合はvarcharを使う必要が
あります。さらに、4KiB以下になるようにします。具体的には
varchar(1023)以下にします。

詳細: http://pgroonga.github.io/ja/tutorial/#equal-string

インデックスはこんな感じにします。

  CREATE INDEX ... USING pgroonga (url);
  CREATE INDEX ... USING pgroonga (url pgroonga.varchar_full_text_search_ops);

> 5, URL用のトークナイザーとノーマライザー
>   ノーマライザーなしの、 TokenBigramが良いでしょうか?

ノーマライザーはNormalizerAutoでトークナイザーはTokenRegexp
がいいです。

そっちの方が

> url like '%/a/b/c'

の処理をインデックスを使って実現したときに速いからです。

ちなみに、LIKE/ILIKEのときはrecheckという処理が走るのでヒッ
ト件数が多くなると遅くなりがちです。

TokenRegexpを使うと、

  url @~ '/a/b/c\z'

というように書けるんですが、こっちの方が速いです。


あと、

>   Groongaの場合、NormalizeAutoにしたらASCIIは単語の境界でトークナイズされると
>   学んだように記憶しています。

なんですが、

>   URLは単純なバイグラム(あるいは大文字を小文字に変換)にするのが検索に向いている
>   思います。

TokenRegexpはすべてのトークンを2文字ごとにします。
なので、すべての部分文字列でヒットします。

>   と思ったのですが、NormalizerNoneという指定はないように思います。
>   http://groonga.org/ja/docs/reference/normalizers.html
> 
> どのようにするのが良いでしょうか?

PGroongaでノーマライザーを指定しない場合は

  CREATE INDEX ... WITH(normalizer='');

あるいは

  CREATE INDEX ... WITH(normalizer='none');

とします。

参考: http://pgroonga.github.io/ja/reference/create-index-using-pgroonga.html#custom-normalizer

これはPGroongaレベルで処理しているのでGroongaに
NormalizerNoneというノーマライザーはないのです。


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