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 作成して指定すれば 複数のデータベースに対する操作ができる。

Tags of current page

, ,