8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-09-26

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

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?