BloGroonga

2015-09-01

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

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

PGroongaについてやPGroongaと他の類似システムとの違いについてはPGroonga 0.2.0のリリースアナウンスを参考にしてください。

0.8.0は0.7.0と互換性があるので、PGroonga用のインデックスを再作成する必要はありません。PGroongaをアップグレードし、接続しなおせばPGroonga 0.8.0になります。

PGroongaの速度については次の記事を参考にしてください。

0.8.0での変更点

0.6.0からの変更点は次の通りです。(0.7.0のリリースアナウンスをしていなかったので0.7.0の変更点も含みます。)

  • 非互換:これまではPGroongaのログはPostgreSQLのログ出力の仕組みを使って出力していましたが、ファイルに出力するように変更しました。この挙動はpgroonga.log_type(後述)とpgroonga.log_path(後述)で変更できます。
  • pgroonga.log_type: ログの出力方法を変更する変数を追加しました。ファイル、Windowsイベントログ、PostgreSQLのログ出力機構、のどれかを選べます。
  • pgroonga.log_path: ファイルにログを出力するときの出力先のファイル名を変更する変数を追加しました。
  • pgroonga.log_level: ログレベルを変更する変数を追加しました。
  • pgroonga.lock_timeout: ロック獲得時のリトライ数を変更する変数を追加しました。
  • pgroonga.snippet_html: 指定したテキストから指定したキーワード周辺のテキストを抽出する関数を追加しました。よくWeb検索エンジンの検索結果に表示されているやつです。PGroongaの全文検索機能に依存していないので、この関数単独でも使えます。
  • Ubuntu 14.04 TLS (Trusty Tahr)のパッケージ提供を開始しました。
  • TRUNCATEすると動かなくなる問題を修正しました。
  • VACUUM時の処理を高速化しました。

pgroonga.log_typeのWindowsイベントログ出力とpgroonga.snippet_html関数は少し細かく説明します。

pgroonga.log_typeのWindowsイベントログ出力

次のように設定するとWindowsイベントログとしてログを出力できます。(通常は↓のようにSQLで設定せずにpostgresql.confに書いて設定します。)

SET pgroonga.log_type = 'windows_event_log';

これだけでWindowsイベントログに記録されるのですが、この状態でイベントビューアーで表示すると警告メッセージがでてログを確認しづらいです。

次のようにコマンドプロンプトから「PGroonga」というイベントを登録することで、警告メッセージが消えて確認しやすくなります。Windowsイベントログを使うときは設定することをオススメします。

> regsvr32 /n /i:PGroonga ${PostgreSQLをインストールしたフォルダ}\lib\pgevent.dll

なお、この手順はPostgreSQLでWindowsイベントログを利用する場合の手順と同様です。参考:WindowsにおけるEvent Logの登録

pgroonga.snippet_html関数

pgroonga.snippet_html関数を使うと該当テキスト中からキーワードが含まれている箇所の周辺テキストを抽出できます。Web検索エンジンは検索結果にこの情報を含めていることが多いので見たことがあるはずです。

例として、次のテキスト(Groongaの説明文)を使います。

Groonga is a fast and accurate full text search engine based on inverted index. One of the characteristics of Groonga is that a newly registered document instantly appears in search results. Also, Groonga allows updates without read locks. These characteristics result in superior performance on real-time applications.

このテキストの中には「fast」というキーワードが含まれています。pgroonga.snippet_htmlを使うと「fast」周辺のテキストを抽出します。キーワードは「<span class="keyword">」と「</span>」で囲まれます。pgroonga.snippet_htmlhtmlはHTMLとして出力するという意味だということです。

Groonga is a fast and accurate full text search engine based on inverted index. One of the characteristics of Groonga is that a newly registered document instantly appears in search results. Also, Gro

なお、この機能はPGroongaで検索した結果以外にも使えます。そのため、次のようにFROMなしのSELECTでも使えます。なお、unnestは配列を行にするPostgreSQLの関数です。

SELECT unnest(pgroonga.snippet_html(
  'Groonga is a fast and accurate full text search engine based on ' ||
  'inverted index. One of the characteristics of Groonga is that a ' ||
  'newly registered document instantly appears in search results. ' ||
  'Also, Groonga allows updates without read locks. These characteristics ' ||
  'result in superior performance on real-time applications.' ||
  '\n' ||
  '\n' ||
  'Groonga is also a column-oriented database management system (DBMS). ' ||
  'Compared with well-known row-oriented systems, such as MySQL and ' ||
  'PostgreSQL, column-oriented systems are more suited for aggregate ' ||
  'queries. Due to this advantage, Groonga can cover weakness of ' ||
  'row-oriented systems.',
  ARRAY['fast', 'PostgreSQL']));
                                                                                 --                                unnest                                                                                                                 
-- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--  Groonga is a <span class="keyword">fast</span> and accurate full text search engine based on inverted index. One of the characteristics of Groonga is that a newly registered document instantly appears in search results. Also, Gro
--  ase management system (DBMS). Compared with well-known row-oriented systems, such as MySQL and <span class="keyword">PostgreSQL</span>, column-oriented systems are more suited for aggregate queries. Due to this advantage, Groonga
-- (2 rows)

pgroonga.snippet_htmlの使い方は次の通りです。

pgroonga.snippet_html(target, ARRAY[keyword1, keyword2, ...])

targettext型の値でキーワード抽出対象のテキストを指定します。

keyword1, keyword2, ...text型の配列で、抽出対象のテキストを指定します。1つ以上指定してします。

pgroonga.snippet_htmltext型の配列を返します。

配列の各要素にはキーワード周辺のテキストが含まれています。キーワードは「<span class="keyword">」と「</span>」で囲まれ、元のテキストに含まれる<, >, &, "はHTMLエスケープされます。

各要素に含まれる元テキストは最大200バイトになります。文字数ではなくバイト数です。これに加えて「<span class="keyword">」と「</span>」が増え、<>&lt;, &gt;などに変換するので、各要素のテキストは200バイト以上になることがあります。

おねがい

PGroongaは毎月のリリースを重ねて、性能も使い勝手も向上してきました。上述のベンチマーク結果を見ると実用になる速度がでていることがわかります。

すでに実際に利用している人たちもいます。まだ利用していない人は、ぜひ、自分たちのシステムで実用できるか検討してみてください。PGroongaは既存の優秀な全文検索エンジンGroongaを利用しているため性能は折り紙つきです。(検討結果を広く公開してもらえると他のPostgreSQLユーザーに有益です!)

また、公式サイト公開に向けて協力してくれる人も募集しています。http://pgroonga.github.io/で英語でも情報も公開しようと進めています。コードは書けないけど英語は書ける、デザインはできるなど協力してくれる方はGitHubのIssueにコメントを書いてください。まずはREADMEを英語に翻訳する作業があります。

まとめ

最新のPostgreSQLでGroongaを使えるようにするPGroongaの新しいバージョンをリリースしました。PostgreSQLで日本語全文検索をしたいという方はぜひ試してみてください!