全文検索エンジンGroongaの2014年の最新情報

## はじめに

[Groonga Advent Calendar 2014](http://qiita.com/advent-calendar/2014/groonga)最後の記事としてGroongaに関連する2014年の最新情報を紹介します。（1日目で[Groongaの特徴](http://qiita.com/groonga/items/98b526802a6e9a0d44ae)を紹介しているので、Groonga？という方はまずはそちらを読んでみてください。）

参加してくれたみなさんありがとうございました！

紹介する情報は大きくグループ化すると次の通りです。

  * 位置情報関連
  * 高速化関連
  * 検索関連
  * 機能関連
  * パッケージ関連
  * プラットフォーム関連
  * インターフェイス関連
  * イベント関連

## 位置情報関連

### `geo_in_rectangle()`関数が全世界をサポート

指定した矩形内に存在する点を検索する[`geo_in_rectangle()`関数](http://groonga.org/ja/docs/reference/functions/geo_in_rectangle.html)が全世界の点をサポートしました。以前は北半球の点のみのサポートでした。

きっかけは、去年開催した[全文検索エンジンGroongaを囲む夕べ 4](http://groonga.org/ja/blog/2013/12/04/after-groonga-night-4.html)での[DeNAの沖津さんのGroongaとMapKitという発表](https://speakerdeck.com/okitsutakatomo/groonga-with-mapkit)でした。この発表の中で`geo_in_rectangle()`関数が北半球しかサポートしていないから別の方法で対応した、という話があったのです。必要なら実装しなくては！ということで次のリリースでは`geo_in_rectangle()`関数を北半球だけでなく全世界で動くようになりました。

みなさんも困ったことや要望を伝えてみてはいかがでしょうか。Groongaは日本で開発されているので日本語で伝えることができます。みなさんのフィードバックでGroonga本体がよくなっていきます！

## 高速化関連

### `between()`関数を追加

`1 <= column && column <= 10`というような範囲クエリーを高速に実行する[`between()`関数](http://groonga.org/ja/docs/reference/functions/between.html)を追加しました。これはSQLでいう`column BETWEEN 1 AND 10`に相当します。

実際、[Mroonga](http://mroonga.org/)（MySQLからGroongaを使うためのストレージエンジン。SQLでGroongaを使える）では、`column BETWEEN 1 AND 10`というクエリーを指定されたら内部的に`between()`関数に置き換えて実行しています。

レコード数やデータの偏り具合にもよりますが、1万レコードで10倍、10万レコードで100倍ほど高速になる場合があります。

参考URLは次の通りです。

  * [`between()`関数を使った場合と使わなかった場合のベンチマーク結果](http://slide.rabbit-shocker.org/authors/kou/rubykaigi-2014/?page=48)（「mruby」の列が`between()`関数を使った場合で、「no mruby」の列が`between()`関数を使っていない場合。）

### `in_values()`関数を追加

`column == 1 || column == 2 || column == 3`というような等価条件をORでつなげたクエリーを高速に実行する[`in_values()`関数](http://groonga.org/ja/docs/reference/functions/in_values.html)を追加しました。これはSQLでいう`column IN (1, 2, 3)`に相当します。

（`in_values()`関数のドキュメントはまだ書かれていません。。。）

### `range_filter`コマンドを追加

範囲検索に特化した`select`コマンドのような[`range_filter`コマンド](http://groonga.org/ja/docs/reference/commands/range_filter.html)を追加しました。ヒット件数の取得やドリルダウンなどはできないのですが、上位N件を取得するといった検索を`select`コマンドよりも高速に実行できます。

SQLでいうと`ORDER BY LIMIT`を指定することで高速になるケース用のコマンドです。

（`range_filter()`コマンドのドキュメントはまだ書かれていません。。。）

### mrubyのクエリーオプティマイザーをサポート

内部の話ですが、クエリーオプティマイザーをmrubyで書けるようになりました。これにより、これまで対応していなかったようなクエリー最適化を実装する基盤ができました。これからのGroongaの高速化に期待してください！

なお、Windows版のGroongaパッケージではmrubyが組み込まれていて、mrubyベースのクエリーオプティマイザーが使われています。

## 検索関連

### レコード毎の重み付けに対応

これまではインデックス毎に検索結果のスコアの重みを指定することができましたが、それに加えてマッチしたレコード毎にも重みを指定することができるようになりました。

レコード毎に重みを指定することができると、特定のレコードを「ピックアップ」する（スコアーを高く）ことができます。例えば、「Groonga」でWebサイト検索をしたとき、「Groongaの公式サイト」に高い重みを指定しておくと、他のWebサイトよりも高いスコアーにできます。

参考URLは次の通りです。

  * [Groonga 4.0.1リリース](http://groonga.org/ja/blog/2014/03/29/release.html)
  * [`select`コマンドの`adjuster`オプション](http://groonga.org/ja/docs/reference/commands/select.html#adjuster)
  * [重み付きベクターカラム](http://groonga.org/ja/docs/reference/columns/vector.html#weight-vector-column)

### 近傍検索記法を追加

もともと[`select`コマンドの`filter`オプション](http://groonga.org/ja/docs/reference/commands/select.html#filter)では[近傍検索を指定](http://groonga.org/ja/docs/reference/grn_expr/script_syntax.html#near-search-operator)できたのですが、[`query`オプション](http://groonga.org/ja/docs/reference/commands/select.html#query)では指定できませんでした。[Groonga 4.0.5](http://groonga.org/ja/blog/2014/08/29/release.html)からは`*N"キーワード1 キーワード2"`という記法で指定できるようになりました。

詳細は[Groonga 4.0.5のリリースアナウンス](http://groonga.org/ja/blog/2014/08/29/release.html)を確認してください。

## 機能関連

### データベース（カラム）のファイルサイズ増加を抑制

Groongaは可変長の値を入れるカラム(*)に対して値の削除や更新を繰り返すと、場合によってそのカラムのファイルサイズが大きくなっていくという問題がありました。

(*) `ShortText`や`Text`などの可変長サイズの型を使っているカラムかベクターカラム。ベクターカラムの場合は`Int32`など固定長サイズの型でも可変長の値になる。

この問題に対して、いくつか対策をしました。[Groonga 3.1.2](http://groonga.org/ja/blog/2014/01/29/release.html)では必要のない更新を避けるという対策が入り、[Groonga 4.0.1](http://groonga.org/ja/blog/2014/03/29/release.html)では更新しても問題を発生しにくくするという対策が入りました。

これらの対策のおかげでほとんどのケースで肥大化は起きなくなっています。詳細は次の記事を参考にしてください。

  * [全文検索エンジンGroongaでデータベースの肥大化を防ぐには - Qiita](http://qiita.com/groonga/items/d18c5df5410207b4f0e6)
  * [Groongaでの可変長データの管理方法 - ククログ(2014-03-13)](http://www.clear-code.com/blog/2014/3/13.html)

この対策の有効性についての検証に協力してくれたみなさん、ありがとうございました！

### キーワードハイライト関数を追加

キーワードハイライトをする[`highlight_html()`関数](http://groonga.org/ja/docs/reference/functions/highlight_html.html)と[`highlight_full`()関数](http://groonga.org/ja/docs/reference/functions/highlight_full.html)を追加しました。

[`snippet_html`()関数](http://groonga.org/ja/docs/reference/functions/snippet_html.html)でもハイライトできたのですが、文書全体をハイライトする用ではありませんでした。追加した`highlight_html()`関数は文書全体をハイライトする機能です。

この機能は[@naoa_y](https://twitter.com/naoa_y)さんが開発しました。ありがとうございます！

### トークンフィルター機能を追加

実験的な機能扱いですが、トークナイズ後のトークンを処理する機能、トークンフィルター機能を追加しました。トークンフィルターはプラグインとして拡張することができます。

ストップワードを実現するトークンフィルターとステミングを実現するトークンフィルターをバンドルしています。

使い方は[Groonga 4.0.7のリリースアナウンス](http://groonga.org/ja/blog/2014/10/29/release.html)を参考にしてください。

### カラム圧縮機能を追加

実験的な機能扱いですが、カラムの値を圧縮する機能を追加しました。カラム圧縮機能を利用するとカラムの読み書き時のCPU使用量が増えます（圧縮・伸張するため）が、I/Oが減ります（ディスクに読み書きするサイズが減るため）。

圧縮アルゴリズムにはzlibと[LZ4](https://code.google.com/p/lz4/)を使えます。

使い方は[Groonga 4.0.7のリリースアナウンス](http://groonga.org/ja/blog/2014/10/29/release.html)を参考にしてください。

この機能は[@naoa_y](https://twitter.com/naoa_y)さんが開発しました。ありがとうございます！

### 複数のカラムをキーにしたドリルダウンのサポート

`select`コマンドでは1つのカラムの値を使ってのドリルダウンしかできませんでしたが、複数のカラムの値を使ってドリルダウンできるようになりました。

実例を見た方がわかりやすいので、気になる方は[Groonga 4.0.9のリリースアナウンス](http://groonga.org/ja/blog/2014/11/29/release.html)か[Groongaの複数キーのドリルダウンとin_values関数を試してみた](http://qiita.com/naoa/items/4b96eb6f5174aca8c36b)を参考にしてください。

### 管理ツールの刷新

[Groongaの細かいことを知らなくても使えるWebブラウザー上で動く管理ツール](http://qiita.com/groonga/items/1a4bf4e69a3bfb8a0663)を開発中です。現在は検索機能だけ動いているのですが、既存の管理ツールよりかなり使いやすくなっています。

## パッケージ関連

### Ubuntuのパッケージ配布URL変更

これまでは他のプラットフォームと同じように http://packages.groonga.org/ でUbuntuのパッケージも配布していましたが、[Launchpad](https://launchpad.net/)を利用するようにしました。LaunchpadはUbuntu用のパッケージビルド・パッケージ配布機能を提供しているサービスです。

Ubuntuに入っているパッケージ管理ツールはLaunchpadで配布されているパッケージを簡単に使うための機能が入っているのでインストール方法がこれまでよりも簡単になりました。詳細は[インストールドキュメント](http://groonga.org/ja/docs/install/ubuntu.html#ppa-personal-package-archive)にまとめてありますが、抜粋すると↓だけでGroongaのパッケージをインストールする準備ができるようになりました。

```text
% sudo add-apt-repository -y ppa:groonga/ppa
```

### ConoHa支援プログラムを利用開始

パッケージ配布サーバー（ http://packages.groonga.org/ ）のために[ConoHa支援プログラム](https://www.conoha.jp/community)を利用することにしました。これまでは既存のサーバーに相乗りしていたのですが、分離したことで管理しやすくなりました。とても助かっています。

ConoHaには他にもイベント開催を協力してもらったりしていて、こちらもとても助かりました。ありがとうございます！

## プラットフォーム関連

### HerokuでGroonga・Rroonga・Nroongaを利用可能になった

[Heroku](https://www.heroku.com/)というPaaSでGroonga・Rroonga・Nroongaを使えるようになりました。Herokuはアプリケーションのコードを`git push`するとデプロイして運用してくれるサービスです。Herokuを利用することでアプリケーション開発者は運用のことはHerokuにお任せしてアプリケーションの開発に集中することができます。

そんなHerokuでGroongaを使えるようになりました。これは全文検索機能が必要なアプリケーションをHerokuの上で動かしやすくなったということです。

使い方は次のURLを参考にしてください。

  * [GroongaビルドパックのREADME](https://github.com/groonga/heroku-buildpack-groonga#readme)
  * [HerokuでRroongaを使う方法 - ククログ(2014-05-28)](http://www.clear-code.com/blog/2014/5/28.html)
  * [Ruby, Heroku and Groonga tutorial 2014](http://okamuuu.hatenablog.com/entry/2014/08/28/094936)

HerokuでGroongaを使えるようにする仕組みについて気になる方は次のURLを参考にしてください。

* [Heroku用Groongaのビルド方法 - ククログ(2014-06-05)](http://www.clear-code.com/blog/2014/6/5.html)

なお、Heroku用のGroongaは[@ryo_sugryo](https://twitter.com/ryo_sugryo)さんがビルドしてくれています。ありがとうございます！

### Webブラウザー上でGroongaを試せるTry Groongaを公開

Herokuの上でGroongaを動かせるようになったので、「Groongaを動かせるWebアプリケーション」をHeroku上で動くようにしました。それが[Try Groonga](http://try-groonga.herokuapp.com/)です。

ローカル環境にGroongaをインストールしなくてもGroongaを試せるので、ちょっと挙動を確認したいときやドキュメントに書いているサンプルを動かしたいときに便利です。

### デプロイスクリプトが増加

2014年はChefやAnsibleを使ってデプロイするためのスクリプトが続々と公開されました。

  * [GroongaをデプロイするためのChefのcookbook](https://github.com/groonga/chef-cookbooks)
  * [GroongaをデプロイするためのAnsibleのplaybook](https://github.com/cosmo0920/playbook-Groonga)
  * [MySQL 5.6とMroongaをデプロイするためのChefのcookbook](https://github.com/marcy-cookbooks/mysql56-mroonga)
  * [Ubuntu 14.04にMySQL 5.5とMroongaをデプロイするためのDockerfile](https://github.com/soundkitchen/docker-mroonga)

## インターフェイス関連

### HTTPサーバーがPOSTに対応

GroongaはnginxベースのHTTPサーバー機能と独自実装のHTTPサーバー機能を提供しています。独自実装のHTTPサーバー機能は必要最小限の機能しか実装していなかったため、これまでPOSTに対応していませんでした。（nginxベースのHTTPサーバー機能の方では対応していました。）[Groonga 4.0.3](http://groonga.org/ja/blog/2014/06/29/release.html)から独自実装のHTTPサーバー機能でもPOSTに対応したので、大きなデータを[`load`コマンド](http://groonga.org/ja/docs/reference/commands/load.html)で投入することができるようになりました。

### GQTPサーバーのデフォルトポート番号を変更

これまでHTTPサーバーもGQTPサーバーもどちらもデフォルトで10041番ポートを利用していましたが、GQTPサーバーはデフォルトで10043番ポートを利用するように変更しました。これは、デフォルトのポート番号が重複していると区別しにくくて使いにくいためです。なお、GQTPサーバーの方のポート番号を変更した理由は、HTTPの方が推奨プロトコルだからです。

## イベント関連

今年は「年に1度のいい肉の日の大きなイベント」だけでなく「年に何度も小さなイベント」を実施することで、よりGroongaについて知ってもらおうとしました。

2014年にあったイベントは次の通りです。

  * [Groonga Meetup 2014/01/29](http://groonga.org/ja/blog/2014/01/29/groonga-meetup.html)：2014-1-29（肉の日！）開催。集まってなにかGroongaに関する作業をしよう、というイベント。
  * [全文検索エンジンGroonga勉強会＠札幌 2014/03/29](http://groonga.org/ja/blog/2014/03/29/sapporoonga.html)：2014-3-29（肉の日！）開催。札幌でのGroongaイベントの開催は[3年振り](https://atnd.org/events/20451)2回目です。
  * [Groonga Meetup 2014/04/29](http://groonga.org/ja/blog/2014/04/29/groonga-meetup-2.html)：2014-4-29（肉の日！）開催。ハンズオン形式で実際にGroongaを触りました。
  * Groongaドキュメント読書会：Groongaの公式ドキュメントを読みながら気になったことはGroonga開発者が解説して参加者がGroongaの理解を深めるイベント。
    * [Groongaドキュメント読書会1](http://groonga.doorkeeper.jp/events/11169)：2014-5-15開催。
    * [Groongaドキュメント読書会2](http://groonga.doorkeeper.jp/events/11834)：2014-6-3開催。
    * [Groongaドキュメント読書会3](http://groonga.doorkeeper.jp/events/13039)：2014-7-23開催。
    * [Groongaドキュメント読書会4](http://groonga.doorkeeper.jp/events/14275)：2014-8-25開催。
    * [Groongaドキュメント読書会5](http://groonga.doorkeeper.jp/events/16395)：2014-10-27開催。
    * [Groongaドキュメント読書会6](http://groonga.doorkeeper.jp/events/17229)：2014-12-11開催。
  * [ConoHa presents - Groonga "How-To" Talks](http://groonga.org/ja/blog/2014/09/03/conoha-presents-groonga-how-to-talks.html)：2014-9-3開催。Groonga関連の「How-To」を共有するイベント。
  * [全文検索エンジンGroongaを囲む夕べ5](http://groonga.doorkeeper.jp/events/15816)：2014-11-29（年に1度のいい肉の日！）開催。毎年恒例のいい肉の日のイベント。

## まとめ

2014年のGroonga関連情報を紹介しました。気になるものはありましたか？

Groongaプロジェクトはユーザーからのフィードバックを待っています！困ったことや要望などあれば[メーリングリスト](http://lists.sourceforge.jp/mailman/listinfo/groonga-dev)、[@groonga](https://twitter.com/groonga)、[Issues](https://github.com/groonga/groonga/issues/)やオフラインのイベントなどでぜひ声をきかせてください。

それでは、2015年もGroongaを使ってガンガン検索してください！