まずはgroongaとはなにか。端的に言えば、オープンソースでカラムストア機能がついた全文検索エンジンである。「Senna」というオープンソースの組み込み型全文検索エンジンの後継にあたる。基本的にはCのライブラリ、またはHTTPでアクセスできる全文検索サーバーとして使用する。更新が頻繁に生じる環境で高速な全文検索が求められる場面に強い。
groongaは単体で使うほかに、関連プロジェクトと組み合わせると使い方が広がるのも大きな特徴である。関連プロジェクトは「groongaファミリー」、「*roonga族」などと呼ばれている。
いま主要なファミリーは4つ。まず1つめは検索エンジン「groonga」(ぐるんが)。2つめはデータベースという側面をいかしたRDBMSのストレージエンジン。主にMySQLのストレージエンジン「mroonga」(むるんが)がある。3つめはRubyのライブラリ「rroonga」(るるんが)、4つめはNode.jsのライブラリ「nroonga」(ぬるんが)。
groonga開発者である未来検索ブラジルの森大二郎さんはgroongaのコアについて「KVSはkey-valueがペアになっているが、groongaのデータモデルはkey←→id、id→valueとなっている。またgroongaにおけるテーブルとは(RDBMSのテーブルとは異なり)key←→idを高速に検索(変換)するモジュールである。ハッシュ表やトライなどで実装されている。一方テーブルとは別に、それぞれが固有のデータ構造を持つカラムが存在していている。これにより複数のカラムを持つことができ、多様なデータ構造を表現できるようになっている」と説明。またデータベースを複数プロセスで共有可能となっていることや、更新処理は先に述べたテーブルやカラム単位でアトミックに実行できるのも特徴だ。これで更新と検索の性能が両立できている。
ただしこの多様な側面はgroonga初心者にとって「どう使い分けるべきか?」と悩みの種でもある。森さんはヒントとして「クエリごとに計算量が異なる」とし、処理時間の違いを示した。短い順にキー参照(usec単位)、インデックス参照(msec単位)、全文検索(10m~100msec)、テーブルスキャン(sec単位)と単位が異なる。KVS的に使うなら低レイヤのAPI(例えばrroonga)、全文検索ならHTTP経由のアクセス(groonga)ということになりそうだ。
将来的にはスケールアップとスケールアウトのいずれも取り組む。スケールアップは「groonga++」で最大レコード数を1000倍の1兆にまで拡大するとのこと。スケールアウトはMySQLユーザー向けにはSpiderとmroongaの組み合わせがあり、ほかにもfluentdでレプリケーションだけではなくシャーディングもできないかと「絶賛実験中」だそうだ。
今回の勉強会はコンパクトなユーザー事例が次々と報告された。特にrroongaの事例が目立った。rroongaだと低レイヤのAPIが使えるためか、速さを求められられるシステムで採用されることが多いようだ。例えばVOYAGE GROUPで使われる広告配信システム、ニコニコ生放送のリアルタイムコメント検索の「ニコ番」、ソースコード検索エンジン「Milkode」などが紹介された。
ニコ番を開発した「てみた」さんは、当初「ニコ生のコメントを使えば人力の地震速報ができるのでは」という構想を抱いた。キーボードに手を置いているユーザーの声を拾えば速くて確実ということだ。しかしそれを実現するにはワードの抽出やプッシュ配信という機能を持たせなくてはならない。
「KVSのような検索エンジンがほしい。動的に構築できて、かつ高速に検索できるもの。どうせならRubyでいろいろと試したい」と思っていたところ、rroongaが条件にうまく合った。チュートリアルが分かりやすかったのも良かったそうだ。そうしてできたのが「ニコ番」だそうだ。
Milkodeは2万ファイル程度であれば、1秒以内に目的の行を検索できるとのこと。開発した「ongaeshi(おんがえし)」さんはgroongaとrroongaを使う良さとして、groongaにはカラムストア(データベース)機能があるため、groongaをインストールすれば別途データベースをインストールする必要がないこと、Rubyだけで書けること、ローカル検索にも強いことを挙げた。
mroongaの事例にはnanapiの和田さんが登場した。今では検索のサジェストにmroongaを使っている。サイトの上部に表示される検索バーにキーワードを入力すると表示されるものだ。例えば「恋愛」と入力すると「恋愛のハウツー」、「恋愛トラブルの対処法」など関連するカテゴリがサジェストされる。もともとnanapiでは記事やカテゴリにはMySQLを使っていたため、mroongaは相性がよかった。MySQLとの相性と即座に検索結果を返せるという要件がうまくはまった。
最後は「しだら」さんが「もしgroongaがAmazon CloudSearch互換のAPIだったら」というタイトルで発表。Amazonが提供するクラウド型の検索サービスとしてAmazon CloudSearchがある。これの互換APIとしてGroonga CloudSearchを紹介した。当然オープンソースであり、無料である。現時点ではおおよそのクライアントライブラリは使えるとのこと。ソースはgithubにある。
groongaは毎月29日に最新版をリリースしている。来年も「いいにくの日」にイベントを開催する予定だ。毎年コミュニティの輪が広がり、groongaやそのファミリーの特性を生かした事例が増えてきている。勉強会では参加者のgroongaへの愛着が感じられ、オープンソースコミュニティらしいオープンで創造的な雰囲気に満ちている。来年も楽しみだ。