はじめてのdroonga - 全文検索エンジンgroongaで大規模データを扱うには

[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週連載が最終回を迎えました。groongaの最新情報と今後に興味があれば一読をおすすめします。

* [「最終回　groongaの今と未来」](http://gihyo.jp/dev/clip/01/groonga/0011)

第1回から第10回までの過去記事については、[隔週連載groonga](http://gihyo.jp/dev/clip/01/groonga)のページを参照してください。

今年も11/29に[全文検索エンジンgroongaを囲む夕べ 4](http://atnd.org/events/43461)を開催することになりました。参加登録はお早めに! 発表者も[募集](http://atnd.org/events/43461#application)しています。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。最新のバージョンは2013年8月29日にリリースした[3.0.7](http://groonga.org/ja/docs/news.html#release-3-0-7)です。

今回は、全文検索エンジンgroongaで大規模データを扱うためのdroongaについて紹介します。

# 分散groongaという選択肢

groongaで大規模データを扱うために、現在[droonga](https://github.com/droonga/)「どぅるんが」というプロダクトが開発されています。

これはgroongaで大規模データを扱うべく、分散環境でgroongaを利用できるようにするためのプロダクト群を指します。

droongaそのものの説明については、[gihyo.jp 隔週連載groonga 最終回 groongaの今と未来](http://gihyo.jp/dev/clip/01/groonga/0011?page=2)の「大規模データとgroongaの未来」を参照していただくと良いでしょう。

gihyo.jp 隔週連載groonga 最終回 groongaの今と未来にdroongaを構成するモジュールについての図があるので以下に引用します。

![gihyo.jp 隔週連載groonga 最終回 groongaの今と未来より引用](http://image.gihyo.co.jp/assets/images/dev/clip/01/groonga/0011/thumb/TH400_droonga-module-implementation-languages.png)

アプリケーションからHTTPもしくはSocket.IOで図にあるAPIサーバーモジュールにアクセスすると、分散検索エンジンモジュールが検索結果をかきあつめていい感じにマージして結果を返してくれるという仕組みです。

# チュートリアルからはじめるdroonga

なんとなくdroongaがわかった気がしたところで、実際にどうすればいいのだろうというのが気になるところです。

droongaはすでにdroongaの公式サイトが開設されています。http://droonga.org/ です。

ドキュメントも用意してあって、現在チュートリアルが提供されています。 http://droonga.org/tutorial/ から参照できます。

チュートリアルを順に読み進めていくと、シンプルなフロントエンド、バックエンド構成を簡単に構築できます。

チュートリアルでは、groonga 3.0.5を使用していますが、groonga 3.0.7でもそのままで問題ありません。

おおまかに実施すべきなのは次のとおりです。

* fluent-plugin-droongaのインストール
* node.jsのインストール
* express-droongaのインストール

注意としては、まだリリースされていないので、fluent-plugin-droongaとexpress-droongaは"リリースされるまで"と記載されている手順を実施することです。

インストールと必要なセットアップが完了すると、チュートリアルでフロントエンドと呼んでいるAPIサーバーモジュールにリクエストを投げることができるようになります。(以下はチュートリアルの通りに3000番ポートでAPIサーバーモジュールを起動している場合)

サンプルデータは次のようなデータを使っていました。

<pre>
load --table Shops
[
["_key", "location"],
["根津のたいやき", "35.720253,139.762573"],
["たい焼 カタオカ", "35.712521,139.715591"],
["そばたいやき空", "35.683712,139.659088"],
["車", "35.721516,139.706207"],
["広瀬屋", "35.714844,139.685608"],
...
</pre>

このデータのうち、_keyだけをすべて抜きだすには次のようなリクエストを投げます。
Shopsテーブルの属性(attributes)の_keyを指定しています。

<pre>
% curl "http://localhost:3000/droonga/tables/Shops?attributes=_key"
</pre>

groongaコマンドだと次のようなクエリですね。

<pre>
select Shops --output_columns _key
</pre>

実際の結果次のようになります。

<pre>
% curl "http://localhost:3000/droonga/tables/Shops?attributes=_key"
{
  "result": {
    "count": 36,
    "attributes": [],
    "records": [
      [
        "根津のたいやき"
      ],
      [
        "たい焼 カタオカ"
      ],
      [
        "そばたいやき空"
      ],
      [
        "車"
      ],
      [
        "広瀬屋"
      ],
      [
        "さざれ"
      ],
      [
        "おめで鯛焼き本舗錦糸町東急店"
      ],
      [
        "尾長屋 錦糸町店"
      ],
      [
        "たいやき工房白家 阿佐ヶ谷店"
      ],
      [
        "たいやき本舗 藤家 阿佐ヶ谷店"
      ]
    ],
    "startTime": "2013-09-26T11:29:50+09:00",
    "elapsedTime": 0.001027822494506836
  }
}
</pre>

もちろん、_keyだけでなくlocationカラムも必要であれば、attributesに追加で指定します。

店名に「阿佐ヶ谷」を含むたい焼き屋を検索するリクエストは次のようになります。

<pre>
curl "http://localhost:3000/droonga/tables/Shops?query=%E9%98%BF%E4%BD%90%E3%83%B6%E8%B0%B7&match_to=_key&attributes=_key"
</pre>

groongaコマンドだと次のようなクエリですね。

<pre>
> select Shops --output_columns _key --match_columns _key --query 阿佐ヶ谷
[[0,1380163862.85506,0.00138258934020996],[[[2],[["_key","ShortText"]],["たいやき工房白家 阿佐ヶ谷店"],["たいやき本舗 藤家 阿佐ヶ谷店"]]]]
</pre>

ここまでの例ではすべて同期処理ですが、チュートリアルではSocket.IO を用いた非同期処理についても触れています。
今回はチュートリアルに記載されているシンプルな構成をなぞったので、あまり"分散"な感じがなかったかも知れませんが、なんとなく感じはつかめたでしょうか。

# まとめ

今回は、全文検索エンジンgroongaで大規模データを扱うためのdroongaについて紹介しました。

droongaに興味を持ったなら、まずは[チュートリアル](http://droonga.org/tutorial/)を試してみてください。

fluent-plugin-droongaについては、こちらの[ドキュメント](http://groonga.org/fluent-plugin-groonga/ja/)が参考になるかも知れません。