Help us understand the problem. What is going on with this article?

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away