Hatena::ブログ(Diary)

ダウンロードたけし(寅年)の日記 このページをアンテナに追加 RSSフィード Twitter

2011-03-01

非同期で全文検索エンジンgroongaを叩く AnyEvent::Groonga 書いたよ

要するにAnyEventでgroongaを使いたかったのでperlモジュール書きました。んでもって久々にCPANにアップしましたよ、という告白です。

AnyEvent::Groonga - Groonga client for AnyEvent

http://search.cpan.org/~miki/AnyEvent-Groonga/

非同期でガンガン全文検索エンジンを叩きたいな、ということでAnyEvent::Groonga。

なおYappo さんが取り組まれているCライブラリperlバインディングスとは異なり、AE::Groongaはgroongaディストリビューションに同梱されてるオリジナルの「groongaサーバ」を対象としています。

このgroongaの組み込みサーバは、じつはhttpとgqtp(groonga独自プロトコルらしい)両方をしゃべれます。また普通にローカルのDBとしての問い合わせもできます。

んで、このgqtpプロトコルとローカルDB問い合わせについては、どちらの場合にもクライアント側にgroongaがインストールされている必要があります。

ですがhttpであればクライアント側にはgroongaは必要ありません。なのでgroongaサーバ以外のマシンからは普通にhttp経由で呼び出すのがお手軽なユースケースかと思われます。


使い方

使い方はこう。

use AnyEvent::Groonga;

my $groonga = AnyEvent::Groonga->new(
    protocol => 'http',
    host       => 'localhost',
    port       => '10041',
);

# blocking interface
my $result = $groonga->call(
    select => {
        table                  => "Site",
        query                 => 'title:@test',
        output_columns => [qw(_id _score title)],
        sortby                => '_score',
    }
)->recv;

print $result->dump;

$any_event_cv = $groonga->call( groongaコマンド => 引数リファンレンス ) という形になります。

AnyEventのcondvarがかえってくるので、そのままrecvすればブロッキング風になります。

ノンブロッキングにする場合はcall backを指定してください。

# non-blocking interface
$groonga->call(
    table_create => {
        name => "Test",
        ....
    }
)->cb(
    sub { 
        $result = $_[0]->recv;
    }
);

なお$resultとして取得したオブジェクトですが、AnyEvent::Groonga::Resultというクラスのインスタンスになっています。

例外としてselectコマンドの時だけAnyEvent::Groonga::Result::Selectというさらに深いネームスペースのオブジェクトを返すようにしています。

selectの時だけ$result->hit_numとか$result->itemsなどのメソッドが使えてちょっと便利、にしたつもりなんですが、どうかな。。自分でももっと使い込んでみないとわからんな。ここら辺の設計はだいぶ甘いかも。

なおgroongaのコマンドは全部で20種類以上あり、一応その全部に対してAnyEvent経由でコマンドを投げられるはずなんですが、まだ検証はたりてません。

元のDSLが少々むずかしくて、とくにJSONパラメータでのクオーテーションのエスケープとか、文字コードまわりとか、泥臭い変換処理を伴うため、まだまだ不十分。バグとか不具合などあったら教えてください。

なおgroongaコマンドの詳細についてはgroongaのオフィシャルサイトのドキュメントを参照して下さい。

AnyEvent::Groongaの使い方は、まだあんまりドキュメント書けてないのでテストコードでも見ながらがんばってみてください。


sennaとgroongaについて

全文検索エンジンと言えばsenna、ということで今まで頑にsenna(正確にはtritonn)だけを愛し続けてきたのですが、やっぱり書き込みが多くなってくるとMyISAMのテーブルロックが頻発し、全体のパフォーマンスが低下するし。。。そろそろお別れかしら、と思い始めていました。

というわけで、そろそろgroonga!

  • なんといっても「参照ロックフリー」だゼ
  • mysqlやpostgresに依存しない独自のストレージ持ってるゼ
  • カラム志向のちょっと頑固なKVSだゼ

もうgroongaがまぶしすぎて困ります。

実際に書き込み処理をループで大量にまわしつつ、同じディスクを読んでいるgroongaサーバにselectを並列して投げてみましたが、ほとんどパフォーマンスは劣化しません。参照ロックフリーってすごくいいかも〜。

mysqlのgroongaストレージエンジンも既にリリースはされていますが、

結論として、groongaオリジナルサーバでも十分にパフォーマンスよさげなので、AnyEvent::Groongaは手っ取り早くgroongaの恩恵にあずかりたい、とう人におすすめです。

smegheadsmeghead 2011/06/08 14:27 AnyEvent::Groonga 便利に使わせていただいてます。ありがとうございます。
検索時に、filterを指定した場合に、Syntax Errorになっていました。filter指定を受け付けるようにするpatchを作成しました。
https://gist.github.com/1013825

レディース 靴レディース 靴 2011/09/05 16:39 http://www.lakuho.comようこそ。
弊社はレディース 靴商品通販を主な業務にして、海外の取引関係を運営しております。お客様にもっとも専門的、もっとも完璧的なレディース 靴製品を提供して差し上げるように力を入れております。

レディース 靴レディース 靴 2011/09/07 11:50 http://store.shopping.yahoo.co.jp/lakuho-sp/index.htmlようこそ。
弊社はレディース 靴商品通販を主な業務にして、海外の取引関係を運営しております。お客様にもっとも専門的、もっとも完璧的なレディース 靴製品を提供して差し上げるように力を入れております。

レディース 靴レディース 靴 2011/09/08 15:27 http://storeuser10.auctions.yahoo.co.jp/jp/user/lakuho999ようこそ。
弊社はレディース 靴商品通販を主な業務にして、海外の取引関係を運営しております。お客様にもっとも専門的、もっとも完璧的なレディース 靴製品を提供して差し上げるように力を入れております。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/download_takeshi/20110301/1298911843
リンク元