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を構成するモジュールについての図があるので以下に引用します。
アプリケーションから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については、こちらのドキュメントが参考になるかも知れません。