groonga を使う (1)
ruby binding である rroonga で試しに簡単なデータベースを作ったときのメモ。 http://groonga.rubyforge.org/rroonga/en/file.tutorial.html を読んで実行した。
データベースの作成
groonga のデータベースにはテーブルがあって、テーブルにはカラムがある。 テーブルは複数持てる。
require 'groonga'
Groonga::Context.default_options = { :encoding => :utf8 }
Groonga::Database.create(:path => 'db/main')
テーブルの作成
テーブルは 3 種類ある。使ってみていないので、 どのような用途に対してどれを選択すれば良いのか、まだよくわからない。
- Groonga::Hash
- キーと完全一致するレコードを非常に高速に検索。
- Groonga::PatriciaTrie
- ハッシュテーブルに比べて完全一致検索の速度がやや遅いが、前方一致検索・共通接頭辞探索などの検索が行える。
- Groonga::Array
- 主キーが存在しない。
create_table の :type に :array, :hash, :patricia_trie を与えて指定する。
Groonga::Schema.create_table("KeyValue", :type => :hash)
key_value_table = Groonga["KeyValue"]
データベースを表すオブジェクトは指定しないで Groonga[“KeyValue”] で KeyValue テーブルになる。 不思議な感じがするが Groonga::Context.default で指定されているデータベースに対する 操作になっているということのようだ。
カラムの作成
テーブルにカラムを作成する。
Groonga::Schema.change_table("KeyValue") do |table|
table.text("title")
end
もしくは、Groonga::Schema.create_table のブロックで 上と同じようにして作成する。
レコードの追加
key_value_table.add("key1", :value => 'value1')
key_value_table.add("key2", :value => 'value2')
カラムに対する値はハッシュで与える。
ある値を持つレコードを求める
今までの操作をまとめて 単純に value カラムの値が “value1” であるレコードを求める。
require 'groonga'
require 'fileutils'
FileUtils.mkdir('db')
Groonga::Context.default_options = { :encoding => :utf8 }
Groonga::Database.create(:path => 'db/main')
Groonga::Schema.create_table("KeyValue", :type => :hash) do |table|
table.text("value")
end
key_value_table = Groonga["KeyValue"]
key_value_table.add("key1", :value => 'value1')
key_value_table.add("key2", :value => 'value2')
record_value1 = key_value_table.select do |record|
record.value == "value1"
end
record_value1.each do |record|
puts "#{record['_key']} #{record['value']}"
end
カラムに対する select にはブロックではなく 文字列で条件を与えることができる。 「[カラム名]:[演算子][値]」という書式で演算子には
- なし
- [カラム値] == [値]
- !
- [カラム値] != [値]
- <
- [カラム値] < [値]
- >
- [カラム値] > [値]
- <=
- [カラム値] <= [値]
- >=
- [カラム値] >= [値]
- @
- [カラム値] が [値] を含んでいるかどうか
が指定できる。
record_value1 = key_value_table.select do |record|
record.value == "value1"
end
は次のようにしても同じ。
record_value1 = key_value_table.select("value:value1")
複数のデータベースを開く
ほとんど使わないのだろうが
require 'groonga'
require 'fileutils'
FileUtils.mkdir('c1')
FileUtils.mkdir('c2')
context1 = Groonga::Context.new
context2 = Groonga::Context.new
Groonga::Database.create(:path => 'c1/db', :context => context1)
Groonga::Database.create(:path => 'c2/db', :context => context2)
Groonga::Schema.create_table("table", :context => context1, :type => :hash)
Groonga::Schema.create_table("table", :context => context2, :type => :hash)
context1['table'].add("item1")
context1['table'].add("item2")
context2['table'].add("ITEM1")
puts "Context1"
context1['table'].each do |record|
p record.key
end
puts "Context2"
context2['table'].each do |record|
p record.key
end
のようにして Groonga::Context 作成して指定すれば 複数のデータベースに対する操作ができる。