Edited at

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

More than 3 years have passed since last update.

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については、こちらのドキュメントが参考になるかも知れません。