Groongaの特徴

## はじめに

「Groonga Advent Calendar 2014」の1日目ということでGroongaの2014年の最新情報を紹介する予定でしたが、Groongaの特徴を紹介することにしました。理由は、「Groongaをまだ使っていないけど興味はある」という人がそこそこいそうだからです。（先日、いい肉の日（11/29）に開催された[全文検索エンジンGroongaを囲む夕べ5](http://groonga.org/ja/blog/2014/11/29/groonga-night-5.html)では「Groongaをまだ使っていない」という参加者の方が4割くらいいました。）

次の5つのGroongaの特徴を紹介します。

  1. 即時更新
  2. 安定した高い検索性能
  3. 日本語特化の検索機能
  4. 他システムと連携
  5. 定期リリース

## 即時更新

Groongaは情報の鮮度を大事にしています。どういうことかというと、新しい情報ほど価値が高いのだからすぐに検索できるようにすることは重要なことだ、ということです。

例えば、地震が起きているときや地震がおさまった直後では、「今の地震の震度は？震源地は？」という情報はとても価値がありますが、1時間や1日経つと情報の価値は低くなります。システムに問題が発生したら、それがどのくらいのタイムラグでわかるか、ということも同様です。問題が発生してから数秒でわかって数分で対応できたら被害は小さくなりますが、1日後にわかってそれから対応するのでは被害が大きくなります。（新鮮な情報をさらに推し進めると「予測」したくなります。未来の情報を予測できれば事前に対策をすることができます。）

Groongaは新鮮な情報を検索可能にするために索引を即時更新することを前提に設計しています。データを更新したらすぐに索引に反映し、検索可能になります。

索引の更新方法には次の2つの方法があります。

  1. 索引を直接更新する
  2. 新しくサブ索引を作成して、サブ索引を検索対象に加える

Groongaは「索引を直接更新する」方法を採用しているため、更新したデータをすぐに検索可能にできます。

## 安定した高い検索性能

前述の「新鮮な情報をすぐに検索可能にする」を実現するためには、すぐに索引に反映できるだけでは足りません。索引に反映している間でも常に高速に検索処理を実行できなければいけません。そうしないと、「新鮮な情報を検索可能にするために検索性能が落ちているので、少ない人にしか新鮮な情報を提供できない」という状態になってしまいます。そうではなくて、「多くの人に新鮮な情報を提供したい」のです。

Groongaは索引を更新中でも索引を利用して検索可能な実装になっています。いわゆる参照ロックフリーというものです。参照ロックフリーを実現することで、検索性能を落とすことなく索引を更新できます。（先日の[全文検索エンジンGroongaを囲む夕べ5](http://groonga.org/ja/blog/2014/11/29/groonga-night-5.html)での[よしの](https://twitter.com/y055ie)さんの発表資料の中に「検索のみ」の場合と「検索 + 更新」の場合の速度比較のグラフがありました。よしのさんの資料が公開されたら参照してみてください。更新中も検索性能がほとんど落ちていないことがわかります。）

また、Groongaには定期的に発生する重い処理、というものがありません。そのため、安定して高い検索性能を実現することができます。定期的に発生する重い処理というのは次のようなものです。

  * フルGCによるstop the world（GroongaはCとC++で実装されているためGCがない）
  * 索引のマージ（1つの索引を随時更新しているためマージする必要がない）

## 日本語特化の検索機能

Groongaは日本人が開発している国産の全文検索エンジンです。そのため、日本語に特化した検索機能が含まれています。次の2つを紹介します。

  * ローマ字前方一致検索
  * ハイブリッドBigram

### ローマ字前方一致検索

コンピューター上で日本語を入力するために「かな漢字変換」という方法が広く使われています。これは「読み」として「かな」を入力し、それを漢字やかなや英字などに変換して日本語を入力する方法です。この「読み」としての「かな」を入力するとき、パソコン上ではローマ字入力が用いることが多いです。（スマートフォン上ではフリック入力で「かな」を直接入力する方が多いです。）

そんなローマ字入力での日本語入力に対して便利に使える「ローマ字前方一致検索」機能があります。Groongaが実装しているローマ字前方一致検索機能の動作は次のようになります。

  * ↓のフォーマット: 「入力」 → 「マッチする文字列例」
  * 「to」→「トウキョウ」（「to」に対して「トウキョウ」がマッチする）
  * 「tyo」→「チョウフ」
  * 「cho」→「チョウフ」（ヘボン式もいける）
  * 「と」→「トウキョウ」（ひらがなもいける）

どのケースでも検索対象の文字列の「読み」を用意するだけで後はGroongaがすべてやってくれます。「tyo」と「cho」の違いをユーザーが頑張って吸収する必要はありません。

この機能は検索ボックスでの検索文字列候補を出す場合に使えます。

[ConoHa presents - Groonga "How-To" Talks](http://groonga.doorkeeper.jp/events/12676)で、[@redfigure](https://twitter.com/redfigure)さんが[ぐるなびサイトでの利用事例を紹介](https://speakerdeck.com/redfigure/groongafalsesaziesutodesi-ku-ba-ku?slide=4)しています。

### ハイブリッドBigram

Groongaには組み込みでいくつもトークナイザーが用意されていて、用途によって適切なトークナイザーを選択することができます。もちろん、Bigramベースのトークナイザーも用意してあります。ただし、標準のBigramのトークナイザーはすべての文字を2文字毎にトークナイズするわけではありません。（すべての文字を2文字毎にトークナイズするBigramのトークナイザーもあります。）

正確ではないけどだいたいあっている説明をすると、日本語は2文字毎にトークナイズしますが、英語は単語毎にトークナイズします。例えば次のようにトークナイズします。

  * 入力：日本語はBigram
  * トークン：「日本」、「本語」、「語は」、「Bigram」

新語への対応を考えると、日本語にはBigramは有効です。しかし、一般的に英語にはBigramは向いていません。理由は次の通りです。

  * 字種が少ない（アルファベットは大文字小文字を入れても52種類）ため、同じトークンに対して多くの文書がヒットすることが多く、検索負荷が高くなりがち
  * トークンが単語ではなくなるので、ストップワードやステミングを適用しにくい
    * 例：「and」が「and」にトークナイズされるなら「and」をストップワードにする、と指定できますが、「and」が「an」と「nd」にトークナイズされる場合は、「an」と「nd」をストップワードにするわけにいきません。「and」以外にも「candidate」などトークナイズ後に「an」や「nd」を含む語があるからです。「an」や「nd」をストップワードにすると意図せずマッチしてしまいます。

Groongaは標準のBigramでは、日本語は2文字毎、英語は単語毎にトークナイズすることで、日本語と英語が混じった文章に対してもBigramの苦手な部分を補いながら利用することができます。

## 他システムと連携

Groongaは単体で全文検索サーバーとしても利用できますが、Cライブラリーとしても利用できます。Cライブラリーとして利用できるということは、プログラミング言語を問わず様々なシステムと連携できるということです。（多くのプログラミング言語はCライブラリーと連携する方法を提供しています。）

Groongaは他のシステムと連携することを大事にしています。

他のシステムと連携できると、Groonga側もシステム側もユーザー側もメリットがあります。

  * Groonga：全文検索以外はシステムにお任せして適用分野を広げられる。
  * システム：自分で開発しなくても高速な全文検索機能を追加できる。
  * ユーザー：追加で覚える必要が少なく、簡単に使い始められる。

代表的な連携例はMySQLと連携している[Mroonga](http://mroonga.org/ja/)です。Mroongaの場合は次のようなメリットがあります。

  * Groonga：SQLでもGroongaを利用できる。レプリケーションなどMySQLの便利機能も使える。
  * システム（MySQL）：日本語対応の高速な全文検索機能をサポートできる。（MySQLは標準では日本語に対応した高速な全文検索機能がない。）
  * ユーザー：REST APIなど新しいAPIを使わずに、いつも通りSQLを使いながら日本語で全文検索できる。

以前はPostgreSQLとGroongaを連携するプロダクトもありましたが、しばらくメンテナンスされておらず、現在は動きません。しかし、[再び開発が始まるような動きもある](https://twitter.com/sawada_masahiko/status/538772845367537664)のでPostgreSQLユーザーの方は期待して動向を見守ったり開発に協力したりしてください。

2016-11-29追記: 2015年に[PGroonga](https://pgroonga.github.io/ja/)がリリースされ、PostgreSQLの拡張機能としてGroongaを使えるようになりました。

## 定期リリース

最後の特徴は定期リリースです。

Groongaは（だいたい）毎月肉の日（29日）にリリースしています。毎月リリースしているので、次のメリットがあります。

  * 問題を報告してから修正版が手に入るまでの時間が短い。報告した時期によりますが、月末に報告したものなら数日から遅くても1ヶ月後には修正版がリリースされます。
  * 最新ディストリビューションへの対応が速い。

最初のメリットはそもそも問題が直されないと修正版もなにもあったものではありませんが、多くの場合は、[メーリングリスト](http://lists.sourceforge.jp/mailman/listinfo/groonga-dev)などで報告された問題や機能要望は数日で対応されます。そのため、多くの場合はすぐに修正版がリリースされます。なにか問題や要望があったら報告してみてください。報告方法はメーリングリストや[GitHub Issues](https://github.com/groonga/groonga/issues/)を使ったり、Twitterでつぶやく、といった方法があります。（開発者が日本人なので日本語でつぶやいても拾われやすいです。）

## まとめ

「Groonga Advent Calendar 2014」の1日目として、次のGroongaの5つの特徴を紹介しました。

  1. 即時更新
  2. 安定した高い検索性能
  3. 日本語特化の検索機能
  4. 他システムと連携
  5. 定期リリース

Groongaの2014年の最新情報はまた別の機会にまとめます。