Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

rroongaを使ってrubyでカラムの全文検索をやってみる

Groongaはオープンソースのカラムストア機能付き全文検索エンジンです。

こういうのを、インプロセスDBとも呼ぶようです。
さて、本題であるRroongaはこれをRubyの構文で扱えるようにしたgemです。

前準備

 $ brew install groonga
 $ gem install rgoonga
 $ rbenv rehash

試す

$ irb --simple-prompt -rubygem -rgroonga

とやって、rgoongaを呼び出した状態でirbを起動します。

まずはエンコードutf-8に。

>> Groonga::Context.default_options ={:encoding => :utf8}
=> {:encoding=>:utf8}

データベースを作成します。

>> Groonga::Database.create(:path => '/tmp/bookmark.db')
=> #<Groonga::Database id: <nil>, name: (anonymous), path: </tmp/bookmark.db>, domain: (nil), range: (nil), flags: <>>
>> Groonga::Schema.create_table('items', :type => :hash)
=> [#<Groonga::Schema::
(略)
@table_type=Groonga::Hash>]

itemsというカラムを作成

>> items = Groonga['items']
=> #<Groonga::Hash id: <256>, (略) normalizer: (nil)>

>> items.size
=> 0

itemsにデータを追加

>> items.add('as you like')
=> #<Groonga::Record:...

>> items.add('who am i')
=> #<Groonga::Record:...

>> items.size
=> 2
>> Groonga::Schema.change_table('items'){|table| table.text("title")}
=> [#<Groonga::Schema::TableDefinition:...

既存カラムにtitleという要素を追加

>> title = Groonga['items.title']
=> #<Groonga::VariableSizeColumn ...

>> items['as you like'].title ='ruby'
=> "ruby"

>> items['who am i'].title ='python'
=> "python"

それではお楽しみの検索です。
Rubyらしく、Enumeratorが使えます。

>> items.add('uec')
>> items['uec'].title ='ruby'

>> ruby_items = items.select{|record| record.title =~ 'ruby'}
>> ruby_items.collect{|record| record.key.key}
=> ["as you like", "uec"]

使ってみて

ちょいちょい弄っただけですが、気軽に扱えそうな感じです。
手間もSqliteと大して変わりませんし、デフォで全文検索やN対Nが楽に作れそうなのが良さげです。