PGroongaを使うための調査。

こないだリニューアルした読書びよりでは全文検索エンジンGroongaを使用していて、Rroonga gemを使って全文検索用の処理を実装してあります。ただ、この実装だとPostgresに格納されている商品情報と、Groongaが使う検索用のインデックスが別管理になるので扱いが煩雑なんですよね。そこで、現在開発中の次期カケラの樹 "Sone"ではPGroongaを使おうかなと考えてます。これならActiveRecordから%%演算子を使ったクエリを投げてやれば全文検索できて、実装も管理も簡単になりそうなので。
使うにあたって、レプリケーションに非対応という点が検証必要だったので、試してみました。

前提

  • PostgreSQLで、streaming replicationを使ってアクティブ/スタンバイ構成を組む
  • 障害発生時、インデックスの再生成が必要なのは許容する

小さな個人サービスで、アップタイムを追わないぬるい環境なのでこの程度で大丈夫です。

結果

active側
test=# select * from memos;
-[ RECORD 1 ]----------------------------------------------------------------------
id      | 1
content | PostgreSQLはリレーショナル・データベース管理システムです。
-[ RECORD 2 ]----------------------------------------------------------------------
id      | 2
content | Groongaは日本語対応の高速な全文検索エンジンです。
-[ RECORD 3 ]----------------------------------------------------------------------
id      | 3
content | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。

test=# explain analyze SELECT * FROM memos WHERE content %% '全文検索';
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Bitmap Heap Scan on memos  (cost=8.91..26.60 rows=615 width=36) (actual time=1.332..1.333 rows=1 loops=1)
-[ RECORD 2 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   Recheck Cond: (content %% '全文検索'::text)
-[ RECORD 3 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   Heap Blocks: exact=1
-[ RECORD 4 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   ->  Bitmap Index Scan on pgroonga_content_index  (cost=0.00..8.76 rows=615 width=0) (actual time=1.318..1.318 rows=1 loops=1)
-[ RECORD 5 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |         Index Cond: (content %% '全文検索'::text)
-[ RECORD 6 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Planning time: 0.428 ms
-[ RECORD 7 ]-------------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Execution time: 1.740 ms

test=# SELECT * FROM memos WHERE content %% '全文検索';
-[ RECORD 1 ]----------------------------------------------
id      | 2
content | Groongaは日本語対応の高速な全文検索エンジンです。

当然ながら、全文検索可能。

standby側
test=# select * from memos;
-[ RECORD 1 ]----------------------------------------------------------------------
id      | 1
content | PostgreSQLはリレーショナル・データベース管理システムです。
-[ RECORD 2 ]----------------------------------------------------------------------
id      | 2
content | Groongaは日本語対応の高速な全文検索エンジンです。
-[ RECORD 3 ]----------------------------------------------------------------------
id      | 3
content | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。

test=# explain analyze SELECT * FROM memos WHERE content %% '全文検索';
ERROR:  pgroonga: object isn't found: <IDs16537>

test=# SELECT * FROM memos WHERE content %% '全文検索';
ERROR:  pgroonga: object isn't found: <IDs16537>

レコード自体はレプリケートされている。全文検索は出来ない。

pg_ctl promote後のstandby
test=# SELECT * FROM memos WHERE content %% '全文検索';
ERROR:  pgroonga: object isn't found: <IDs16537>

test=# drop index pgroonga_content_index;
DROP INDEX

test=# CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content);
CREATE INDEX

test=# explain analyze SELECT * FROM memos WHERE content %% '全文検索';
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Index Scan using pgroonga_content_index on memos  (cost=0.13..8.17 rows=2 width=36) (actual time=0.390..0.391 rows=1 loops=1)
-[ RECORD 2 ]-----------------------------------------------------------------------------------------------------------------------------
QUERY PLAN |   Index Cond: (content %% '全文検索'::text)
-[ RECORD 3 ]-----------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Planning time: 0.175 ms
-[ RECORD 4 ]-----------------------------------------------------------------------------------------------------------------------------
QUERY PLAN | Execution time: 0.546 ms

test=# SELECT * FROM memos WHERE content %% '全文検索';
-[ RECORD 1 ]----------------------------------------------
id      | 2
content | Groongaは日本語対応の高速な全文検索エンジンです。

障害発生時にstandbyを昇格させ、インデックスを張り直せば全文検索が可能になる。


ウチの環境では問題なさそうなので、使ってみることにします。