BloGroonga

2012-12-29

今日は年内最後の肉の日ですね。

2月の肉の日に2.0.0をリリースして以来、沢山の改善や変更、不具合修正が行われました。

毎月のリリースでは2.0.xとマイクロバージョンを上げていましたが、今回は年末ですしキリもいいのでマイナーバージョンを上げて2.1.0としました。:-)

groonga 2.1.0リリース

groonga 2.1.0 をリリースしました!

今回のリリースの主なトピックは3つあります。

  • snippet_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"]
        ],
      [
        ["Groonga overview Groonga is a fast and accurate full text search engine based on inverted index."]
        ]
      ]
    ]
  ]

関数の詳細については snippet_html() を参照してください。

正規化のためのプラグイン指定をサポート

今回のリリースでは、正規化方法をプラグインで指定する仕組みを導入しました。

groongaでは Unicodeの正規化形式 としてNFKCを適用するようになっています。

これをテーブルごとに任意の正規化方法を指定できるように拡張しました。

この機能追加が入ったことで、将来的に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からの詳細な変更点は 2.1.0リリース 2012/12/29 を確認してください。

それでは、groongaでガンガン検索してください!