ssig33.com

Groonga で気軽に検索する為の Gem を作りました

Groonga で気軽に検索する為の rubygem です。

Ruby を使ってアプリケーションを開発する際、 Groonga は最も手軽な全文検索ソリューションです。 Ruby の Hash に何かを入れるかのような感覚でデータを永続化し、それをそのまま全文検索することが出来ます。

ですがこれでもまだボトルネックと言える部分があって、 Groonga で全文検索する時は以下のような感じのコードを書かないといけません。

Groonga['bookmarks'].select{|x| x.word =~ "buta"} #ブロックで検索条件組むやつ
Groonga['bookmarks'].select('word:@buta') # Groonga のクエリ形式

ユーザーが入力したデータからこれらを組み立てるのは実際結構めんどくさい作業です。

そこでそれをやるのが Sewell Gem です。ユーザーがよく入力するような自然なクエリから Groonga の形式のクエリを生成することが出来ます。クエリ形式なので rroonga に投げてもいいですし HTTP の先にいる Groonga にクエリを投げてもよいので幅広く使うことができます。

使い方は以下の通り。

文字列からクエリを生成する場合

Sewell.generate('ラーメン二郎 AND ニンニク -カラメ', ['ramen']) 
#=> ( ramen@:ラーメン二郎 ) + ( ramen@ニンニク )  - ( ramen@:カラメ )
Sewell.generate('ニンニク' ['ramen', 'debu']) #=> ( ramen@ニンニク OR debu@ニンニク )

第一引数にクエリを入れて第二引数に検索対象にしたいカラム名を配列で入れるといい感じでクエリを吐いてくれます。

ハッシュからクエリを生成する場合

Sewell.generate({ramen: '二郎 OR 用心棒', gyowza: '佐藤伸一パリ'}, 'AND') 
#=> ( ramen@二郎 OR ramen@用心棒 ) + ( gyowza@佐藤伸一 gyowza@パリ )
Sewell.generate({ramen: '二郎 OR 用心棒', gyowza: '佐藤伸一 パリ'}, 'OR') 
#=> ( ramen@二郎 OR ramen@用心棒 ) OR ( gyowza@佐藤伸一 + gyowza@パリ )

第一引数に key: 検索対象のカラム名 value: クエリ なハッシュを、第二引数に複数のカラムを AND 条件で繋ぐか OR 条件で繋ぐかを入れるといい感じでクエリを吐きます。

ハッシュのやつは複数のフォームから条件をとってきて検索するみたいな用途で使うことを想定しています。

どうぞご利用ください。

back to index of texts


Site Search

Update History of this content