Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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が楽に作れそうなのが良さげです。