HAYASHI Kentaro
hayas****@clear*****
2012年 12月 29日 (土) 00:09:01 JST
林です。 今日は年内最後の肉の日ですね。 groonga 2.1.0をリリースしました! http://groonga.org/ja/docs/news.html#release-2-1-0 2月の肉の日の2.0.0リリースからこれまでのリリースのトピック等を ざっと拾ってみるだけでもこれだけの変更が入っています。 (リリースアナウンスでトピックとして紹介しているのはほんの一部なので 実際には多くの変更や改善、不具合修正が入っています! 詳細は上記お知らせページを参照してください。) * ロゴの一新 * Ubuntu 12.04 (Precise Pangolin)サポート * 類似文書検索のサポート * 管理画面にサジェスト機能用ページを追加 * CMakeビルド対応 * nginxベースのHTTPサーバーを実験的に追加 * 位置情報から距離を計算する組み込み関数(geo_distance)の改善 * Fedora 17サポート * Travis CI の統合に関するドキュメントを追加 * 近傍検索を行う 'column *N "word1 word2 ..."' 構文をサポート * groonga-httpdの機能強化(パスのカスタマイズや複数DBのサポート) * 特定の語句を含まないレコードの検索をサポート * groonga-httpdでhttp_rewrite_moduleのサポート * groonga-httpdでのPOSTによるloadコマンドのサポート * サーバーパッケージ構成と使用ポートの見直し * min/max関数のサポート * クエリ展開のプラグインによるカスタマイズのサポート * Ubuntu 12.10 (Quantal Quetzal)をサポート * snippet_html()関数の実験的なサポート * インデックスにより関連付けられたテーブル間のネストしたインデックス検索のサポート * インデックスを使った指定範囲の高速な検索をサポート 毎月のリリースではマイクロバージョンを上げていましたが、 今回は年末ですしキリもいいのでマイナーバージョンを上げて 2.1.0としました。:-) 今年はgroonga関連のプロダクトもいくつか新規リリースされています。 * fluent-plugin-groonga (fluentdによるgroongaデータベースのレプリケーション) https://github.com/groonga/fluent-plugin-groonga/ * gqtp (GQTPをRubyで実装したライブラリ) https://github.com/ranguba/gqtp * groonga-command (groongaのコマンド列をパースするためのRubyのライブラリ) https://github.com/groonga/groonga-command * groonga-query-log (groongaのクエリログを解析するためのRubyのライブラリとツール) https://github.com/groonga/groonga-query-log みなさんのフィードバックをもとに改善していきます。 ぜひ使ってみて下さい。 さて、今回のリリースの主なトピックは 3つあります。 * snippet_html()関数の引数として式をサポート * 正規化のためのプラグイン指定をサポート * コマンドリストでの継続行のサポート それぞれの環境毎のインストール方法はこちらを見てください。 http://groonga.org/ja/docs/install.html ○ snippet_html()関数の引数として式をサポート 先月のリリース(2.0.9)では、キーワードとその周辺のテキストを抽出するための snippet_html()関数を実験的にサポートしました。 今回のリリースではこのsnippet_html()関数の機能を強化し、引数に式を 指定できるようにしました。 これまではsnippet_html()関数は以下のようにカラム名を指定することができました。 snippet_html(column名) これが、以下のように任意の式も受け付けるようになりました。 snippet_html("STRING" + "STRING") この変更で複数のカラムを対象としたスニペットをまとめて取得できるように なりました。 どんな風に使えるようになったかを具体例で説明します。 以下は説明のためのスキーマ定義とサンプルデータです。 table_create Documents TABLE_NO_KEY column_create Documents title COLUMN_SCALAR ShortText column_create Documents content COLUMN_SCALAR Text table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram column_create Terms document_title_index COLUMN_INDEX|WITH_POSITION Documents title column_create Terms document_content_index COLUMN_INDEX|WITH_POSITION Documents content load --table Documents [ ["title", "content"], ["Groonga overview", "Groonga is a fast and accurate full text search engine based on inverted index."], ["Full text search and Instant update", "In widely used DBMSs, updates are immediately processed, for example, a newly registered record appears in the result of the next query."], ["Column store and aggregate query", "People can collect more than enough data in the Internet era."] ] これまでDocumentsテーブルに登録したデータからキーワードGroongaを含むスニペットを取得したくても titleもしくはcontentカラムのどちらかしか指定することができませんでした。 select Documents --output_columns "snippet_html(content)" --command_version 2 --match_columns content --query "Groonga" これだとtitleカラムやcontentカラムに指定したキーワードを含むスニペットをまとめて 取得したいときに不便です。 今回のリリースではsnippet_html()関数の引数を以下のように指定することで、 まとめて取得することができるようになりました。 select Documents --match_columns title||content --query 'Groonga' --output_columns 'snippet_html(title + " " + content)' --command_version 2 上記クエリでは検索したいキーワードGroongaを--queryに指定し、 検索対象のカラムとしてtitleカラムもしくはcontentカラムを--match_columnsにより指定しています。 snippet_html()関数の引数に title + " " + contentと指定することで、 titleカラムから取得したスニペットとcontentカラムから取得したスニペットを連結した 結果を返すようにしています。(" "は見栄えの都合でスペースを入れています) 結果は以下のようになり、指定したキーワードが<span>タグで囲まれ、キーワード周辺のテキストが スニペットとしてまとめて抽出できていることがわかります。 検索結果のうち、タイトルと本文に含まれる指定したキーワードをハイライト表示するということが これまでより簡単に実現できるようになりました。 [ [0,1356406051.43579,0.000200510025024414], [ [ [1], [ ["snippet_html","null"] ], [ ["<span class=\"keyword\">Groonga</span> overview <span class=\"keyword\">Groonga</span> is a fast and accurate full text search engine based on inverted index."] ] ] ] ] snippet_html()関数の詳細については以下のドキュメントを参照してください。 http://groonga.org/ja/docs/reference/functions/snippet_html.html ○ 正規化のためのプラグイン指定をサポート 今回のリリースでは、正規化方法をプラグインで指定する仕組みを導入しました。 groongaではUnicodeの正規化形式としてNFKCを適用するようになっています。 参考: http://ja.wikipedia.org/wiki/Unicode正規化 これをテーブルごとに任意の正規化方法を指定できるように拡張しました。 この機能追加が入ったことで、将来的にMySQLと同じ文字照合順序(COLLATION) のサポートがmroongaで可能になります。 正規化形式の指定の仕方は以下のように--normalizerオプションをテーブルの 作成時に指定します。 table_create Terms TABLE_PAT_KEY ShortText --normalizer NormalizerAuto これまでテーブルの作成時にKEY_NORMALIZEを使用していた場合と --normalizer NormalizerAutoは同じ意味になっています。 まだサンプルとなるプラグインは追加していませんが、 開発者向けのヘッダファイルgroonga/normalizer.hにて必要なAPIを公開しています。 今回この機能拡張を行ったことで、データベースを一旦開くと古いバージョン のgroongaではデータベースを開けなくなることに注意が必要です。 ○ コマンドリストでの継続行のサポート 今回のリリースでは継続行のサポートを追加しました。 これまで、groongaコマンドに与えるコマンドリストは必ず一行で記述する必要がありました。 クエリが長くなってくるとクエリそのものが見づらいという問題がありました。 これが、継続行であることを示す'\'を使うことでコマンドリストの途中で折り返すことが できるようになりました。 これまで、以下のように一行で書いていたものを table_create --name Terms --flags TABLE_PAT_KEY --key_type ShortText --default_tokenizer TokenBigram 以下のように書けるようになります。 table_create --name Terms \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram ○ 変更点 さて、2.0.9からの変更点は以下の通りです。 http://groonga.org/ja/docs/news.html#release-2-1-0 2.1.0リリース - 2012/12/29 -------------------------- 改良 * [doc] カラムインデックスによる関連テーブルをまたぐ検索 に関するドキュメントを追加。 * snippet_html の引数としてカラム名と連結した文字列を指定すること でスニペットの出力結果をカスタマイズできるようにした。 この変更で、snippet_html("STRING" + "STRING") と書けるようになります。[嶋田 大貴さんが報告] * 正規化を行うプラグインを作成できるようにした。 * groonga-query-log-analyzer を groonga-query-log というrubygemsにして移動しました。 これによりgroongaのパッケージをインストールせずにクエリログの解析を行えるようになります。 * table_create コマンドにて --normalizer オプションの指定をサポートしました。 正規化のためのプラグインを指定できるようになります。 * コマンドリストに書かれた継続行のサポート。 * カラムインデックスによる関連テーブルをまたぐ検索をキーのないテーブルだけでなく、 ハッシュやパトリシア木、ダブル配列を指定したテーブルでも使えるように改善した。 修正 * [windows] O_BINARY フラグをファイルを開くときに指定するようにした。 groonga HTTPサーバが無限ループに陥っていた問題が解決します。 [GitHub#47] [Shimomura Tatsuyaさんがパッチ提供] * --default-match-escalation-threshold が負数を受け付けないため、 検索時に行なわれる挙動の変更を無効化できない問題を修正しました。 オプションの詳細は --default-match-escalation-threshold を参照してください。 * --output_columns で"*"のあとに _score を指定しても無視される不具合を修正した。 感謝 * 嶋田 大貴さん * Shimomura Tatsuyaさん -- HAYASHI Kentaro <hayas****@clear*****>