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

  • 9
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

第1回から第10回までの過去記事については、隔週連載groongaのページを参照してください。

今年も11/29に全文検索エンジンgroongaを囲む夕べ 4を開催することになりました。参加登録はお早めに! 発表者も募集しています。

はじめに

オープンソースのカラムストア機能付き全文検索エンジンgroongaを公開しています。最新のバージョンは2013年8月29日にリリースした3.0.7です。

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

分散groongaという選択肢

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

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

droongaそのものの説明については、gihyo.jp 隔週連載groonga 最終回 groongaの今と未来の「大規模データとgroongaの未来」を参照していただくと良いでしょう。

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

gihyo.jp 隔週連載groonga 最終回 groongaの今と未来より引用

アプリケーションから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サーバーモジュールを起動している場合)

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


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"],
...

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


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

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


select Shops --output_columns _key

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


% 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
  }
}

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

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


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"

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


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

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

まとめ

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

droongaに興味を持ったなら、まずはチュートリアルを試してみてください。

fluent-plugin-droongaについては、こちらのドキュメントが参考になるかも知れません。