BloGroonga

2016-04-15

PGroonga(ぴーじーるんが) 1.0.6リリース

PostgreSQLからGroongaを使えるようにするPGroongaの1.0.6をリリースしました!

新規ユーザーの方は、PGroonga 1.0.0のリリースアナウンスのPGroongaについても参照してください。

変更点

1.0.3からの変更点は次の通りです。

  • [Windows] DLLにバージョン情報を含めるようにしました。
  • [pgroonga.text_full_text_search_ops_v2オペレータークラス] 類似文書検索を行う演算子&~?を追加しました。
  • [pgroonga.text_term_search_ops_v2オペレータークラス] 前方一致検索を行う演算子&^を追加しました。
  • [pgroonga.text_term_search_ops_v2オペレータークラス] 前方一致RK検索(ローマ字・ひらがな・カタカナ入力でカタカナデータを前方一致検索する検索)を行う演算子&^~を追加しました。
  • [Windows] バンドルするGroongaを6.0.1にアップグレードしました。
  • [Windows] ビルド対象のPostgreSQLを9.5.2にアップグレードしました。
  • [Windows] Visual Studio 2015ではなく2013を使ってビルドするようにしました。PostgreSQLのバイナリーが2013でビルドされていることに気づいたためです。

前方一致検索・前方一致RK検索

今回のリリースではpgroonga.text_term_search_ops_v2オペレータークラスを追加しました。このオペレータークラスを使うと前方一致検索・前方一致RK検索を使うことができます。これらの検索は検索欄での入力補完を実現する場合に有用です。

タグを入力補完する例を使って簡単に使い方を説明します。

まず、タグ名とタグのヨミガナを登録します。

CREATE TABLE tags (
  name text PRIMARY KEY
);

CREATE TABLE tag_readings (
  tag_name text
    REFERENCES tags ON DELETE CASCADE ON UPDATE CASCADE,
  katakana text,
  PRIMARY KEY (tag_name, katakana)
);

INSERT INTO tags VALUES ('PostgreSQL');
INSERT INTO tags VALUES ('Groonga');
INSERT INTO tags VALUES ('PGroonga');
INSERT INTO tags VALUES ('pglogical');

INSERT INTO tag_readings VALUES ('PostgreSQL', 'ポストグレスキューエル');
INSERT INTO tag_readings VALUES ('PostgreSQL', 'ポスグレ');
INSERT INTO tag_readings VALUES ('Groonga', 'グルンガ');
INSERT INTO tag_readings VALUES ('PGroonga', 'ピージールンガ');
INSERT INTO tag_readings VALUES ('pglogical', 'ピージーロジカル');

タグ名とタグのヨミガナにインデックスを作ります。tags.nametag_readings.katakanapgroonga.text_term_search_ops_v2オペレータークラスを使っていることがポイントです。

CREATE INDEX pgrn_tags_index ON tags
  USING pgroonga (name pgroonga.text_term_search_ops_v2);
CREATE INDEX pgrn_tag_readings_index ON tag_readings
  USING pgroonga (katakana pgroonga.text_term_search_ops_v2);

タグ名そのもの(PostgreSQLGroonga)に対して前方一致検索をするには次のようにします。

SELECT name
  FROM tags
  WHERE name &^ 'pos';
--     name    
-- ------------
--  PostgreSQL
-- (1 row)

タグをローマ字で検索するには次のようにします。

SELECT tag_name, katakana
  FROM tag_readings
  WHERE katakana &^~ 'pos';
--   tag_name  |        katakana        
-- ------------+------------------------
--  PostgreSQL | ポスグレ
--  PostgreSQL | ポストグレスキューエル
-- (2 rows)

UNIONすると結果をまとめて取得できます。

SELECT name
  FROM tags
  WHERE name &^ 'pos'
UNION
SELECT tag_name
  FROM tag_readings
  WHERE katakana &^~ 'pos';
--     name    
-- ------------
--  PostgreSQL
-- (1 row)

pi-ji-」で検索すると次のようになります。

SELECT name
  FROM tags
  WHERE name &^ 'pi-ji-'
UNION
SELECT tag_name
  FROM tag_readings
  WHERE katakana &^~ 'pi-ji-';
--    name    
-- -----------
--  PGroonga
--  pglogical
-- (2 rows)

PostgreSQLを使って入力補完も実現できると、さらにPostgreSQLを有効活用できますね。

1.0.6をリリースした後に、次のように使えると便利そうだと気づきました。次のリリースではもっと便利になる予定です。ご期待ください。

CREATE TABLE tags (
  name text PRIMARY KEY,
  readings text[]
);

CREATE INDEX pgrn_tags_index ON tags
  USING pgroonga (name     pgroonga.text_term_search_ops_v2,
                  readings pgroonga.text_array_term_search_ops_v2);

INSERT INTO tags VALUES ('PostgreSQL', ARRAY['ポストグレスキューエル', 'ポスグレ']);
INSERT INTO tags VALUES ('Groonga',    ARRAY['グルンガ']);
INSERT INTO tags VALUES ('PGroonga',   ARRAY['ピージールンガ']);
INSERT INTO tags VALUES ('pglogical',  ARRAY['ピージーロジカル']);

SELECT name
  FROM tags
  WHERE name &^ 'pi-ji-' OR
        readings &^~ 'pi-ji-';
--    name    
-- -----------
--  PGroonga
--  pglogical
-- (2 rows)

アップグレード方法

1.0.3、1.0.4、1.0.5と互換性があります。アップグレードの「互換性がある場合」用の手順でアップグレードしてください。

ただし、最後に_v2がついているオペレータークラス(pgroonga.text_full_text_search_ops_v2など)を使っている場合は互換性がないので、その場合は「非互換の場合」の手順でアップグレードしてください。

おしらせ

PGroongaだけでなく全文検索についても興味がある方は「Groongaで学ぶ全文検索」への参加もご検討ください。「Groongaで学ぶ全文検索」は予習・復習なしで全文検索を学ぶ、参加者に合わせて内容を決める、という限られた時間内でできるだけ実りある時間にしようというスタイルの勉強会です。全文検索を学びたい!という方はご活用ください。開催日程はDoorkeeperのGroongaコミュニティのページを参照してください。

次回は4月22日に開催です。

少し先になりますが、6月9日にはMySQLとPostgreSQLと日本語全文検索2を開催します。PGroongaに関する情報もあるのでぜひご参加ください。VVAULT AUDITというログ管理ソフトウェアでのPGroongaの利用事例の紹介もある予定です。

まとめ

PGroongaの新しいリリースを紹介しました。

PostgreSQLで高速に日本語全文検索をしたいという方はPGroongaを使ってガンガン検索してください!