BloGroonga

2015-01-29

PGroonga(ぴーじーるんが) 0.2.0リリース - PostgreSQL 9.4でGroongaを使える!

今日は今年最初の肉の日ですね!

PostgreSQLからGroongaを使えるようにするPGroongaの最初のバージョン、0.2.0をリリースしました!

PGroongaは最新のPostgreSQL 9.4で使えます。PostgreSQLからGroongaを使うためのtextsearch_groongaという拡張機能もありますが、この拡張機能はPostgreSQL 9.4や新しいGroongaでは動きませんでした。

PGroongaはtextsearch_groongaをベースに、最新のPostgreSQL・Groongaで動くようにしたものです。

PostgreSQLで日本語全文検索をする方法には次の方法がありますが、それぞれいくつか問題があります。

  • pg_trgm
    • PostgreSQLに付属しているがデフォルトではインストールされない。
    • 日本語に対応させるにはソースコードを変更する必要がある。
  • pg_bigm
    • 正確な全文検索機能を使うにはRecheck機能を有効にする必要がある。Recheck機能を有効にするとインデックスを使った検索をしてから、インデックスを使って見つかったレコードに対してシーケンシャルに検索をするのでインデックスを使った検索でのヒット件数が多くなると遅くなりやすい。

PGroongaはRecheck機能を使わなくても正確な検索結果を返せるため、ヒット件数が多い時でも性能が落ちにくいです。理論的には。(要ベンチマーク。興味のある人はベンチマークをとって公開してください!)

ただし、PGroongaはWALに対応していないため、PostgreSQLのレプリケーションの仕組みを使えません。pgpool-IIと組み合わせる必要があります。

(WALに対応していないのはPostgreSQLがWALに対応する仕組みを提供していないからです。PostgreSQLのメーリングリストで聞いたところ、開発中ということでした。9.6で入るといいなぁということです。)

インストール方法

現在、CentOS 7用のパッケージのみ提供しています。(次のリリースではUbuntu 14.10用のパッケージも提供する予定です。)CentOS 7ユーザーの人は簡単にインストールできます。他の環境の方はソースからインストールしてください。

インストール方法の詳細はREADME.mdのインストールの項目を参照してください。

使い方

簡単に使い方を紹介します。

まず、text型のカラムを作ってpgroongaインデックスを張ります。

CREATE TABLE memos (
  id integer,
  content text
);

CREATE INDEX pgroonga_index ON memos USING pgroonga (content);

データを投入します。

INSERT INTO memos VALUES (1, 'PostgreSQLはリレーショナル・データベース管理システムです。');
INSERT INTO memos VALUES (2, 'Groongaは日本語対応の高速な全文検索エンジンです。');
INSERT INTO memos VALUES (3, 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');

検索します、といきたいところですがその前に少し準備をします。ここではシーケンシャルスキャンではなくインデックスを使った全文検索を使いたいので、シーケンシャルスキャン機能を無効にします。(あるいはもっとたくさんのデータを投入します。)

SET enable_seqscan = off;

全文検索をするときは%%演算子を使います。

SELECT * FROM memos WHERE content %% '全文検索';
--  id |                      content
-- ----+---------------------------------------------------
--   2 | Groongaは日本語対応の高速な全文検索エンジンです。
-- (1 行)

キーワード1 OR キーワード2のようにクエリー構文を使って全文検索をするときは@@演算子を使います。

SELECT * FROM memos WHERE content @@ 'PGroonga OR PostgreSQL';
--  id |                                  content
-- ----+---------------------------------------------------------------------------
--   3 | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。
--   1 | PostgreSQLはリレーショナル・データベース管理システムです。
-- (2 行)

クエリー構文の詳細はGroongaのドキュメントを参照してください。

まとめ

最新のPostgreSQLでGroongaを使えるようにするPGroongaという拡張機能をリリースしました。PostgreSQLで日本語全文検索をしたいという方はぜひ試してみてください!試してみた方はいろんな人が参照できるようにぜひブログなどに結果を書いてください。特にベンチマーク結果を楽しみにしています!