Class: Groonga::Hash

Inherits:
GrnTable
  • Object
show all
Includes:
GrnTableKeySupport
Defined in:
ext/rb-grn-hash.c,
ext/rb-grn-hash.c

Overview

各レコードをキーで管理するテーブル。キーと完全一致するレコードを非常に高速に検索できる。

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.Groonga::Hash.create(options = {}) ⇒ Groonga::Hash .Groonga::Hash.create(options = ) { ... } ⇒ Object

各レコードをキーで管理するテーブルを生成する。ブロックを指定すると、そのブロックに生成したテーブルが渡され、ブロックを抜けると自動的にテーブルが破棄される。

optionsに指定可能な値は以下の通り。

:context

テーブルが利用するGroonga::Context。省略するとGroonga::Context.defaultを用いる。

:name

テーブルの名前。名前をつけると、Groonga::Context#[]に名前を指定してテーブルを取得することができる。省略すると無名テーブルになり、テーブルIDでのみ取得できる。

:path

テーブルを保存するパス。パスを指定すると永続テーブルとなり、プロセス終了後もレコードは保持される。次回起動時にGroonga::Hash.openで保存されたレコードを利用することができる。省略すると一時テーブルになり、プロセスが終了するとレコードは破棄される。

:persistent

trueを指定すると永続テーブルとなる。pathを省略した場合は自動的にパスが付加される。:contextで指定したGroonga::Contextに結びついているデータベースが一時データベースの場合は例外が発生する。

:key_type

キーの種類を示すオブジェクトを指定する。キーの種類には型名(“Int32”や“ShortText”など)またはGroonga::Typeまたはテーブル(Groonga::Array、Groonga::Hash、Groonga::PatriciaTrieのどれか)を指定する。

Groonga::Typeを指定した場合は、その型が示す範囲の値をキーとして使用する。ただし、キーの最大サイズは4096バイトであるため、Groonga::Type::TEXTやGroonga::Type::LONG_TEXT は使用できない。

テーブルを指定した場合はレコードIDをキーとして使用する。指定したテーブルのGroonga::Recordをキーとして使用することもでき、その場合は自動的にGroonga::RecordからレコードIDを取得する。

省略した場合は文字列をキーとして使用する。この場合、4096バイトまで使用可能である。

:value_type

値の型を指定する。省略すると値のための領域を確保しない。値を保存したい場合は必ず指定すること。

参考: Groonga::Type.new

:default_tokenizer

Groonga::IndexColumnで使用するトークナイザを指定する。デフォルトでは何も設定されていないので、テーブルにGroonga::IndexColumnを定義する場合は"TokenBigram"などを指定する必要がある。

:sub_records

trueを指定すると#groupでグループ化したときに、Groonga::Record#n_sub_recordsでグループに含まれるレコードの件数を取得できる。

使用例:

無名一時テーブルを生成する。

Groonga::Hash.create

無名永続テーブルを生成する。

Groonga::Hash.create(:path => "/tmp/hash.grn")

名前付き永続テーブルを生成する。ただし、ファイル名は気にしない。

Groonga::Hash.create(:name => "Bookmarks",
                     :persistent => true)

それぞれのレコードに512バイトの値を格納できる無名一時テーブルを生成する。

Groonga::Hash.create(:value => 512)

キーとして文字列を使用する無名一時テーブルを生成する。

Groonga::Hash.create(:key_type => Groonga::Type::SHORT_TEXT)

キーとして文字列を使用する無名一時テーブルを生成する。(キーの種類を表すオブジェクトは文字列で指定。)

Groonga::Hash.create(:key_type => "ShortText")

キーとしてBookmarksテーブルのレコードを使用する無名一時テーブルを生成する。

bookmarks = Groonga::Hash.create(:name => "Bookmarks")
Groonga::Hash.create(:key_type => bookmarks)

キーとしてBookmarksテーブルのレコードを使用する無名一時テーブルを生成する。(テーブルは文字列で指定。)

Groonga::Hash.create(:name => "Bookmarks")
Groonga::Hash.create(:key_type => "Bookmarks")

全文検索用のトークンをバイグラムで切り出す無名一時テーブルを生成する。

bookmarks = Groonga::Hash.create(:name => "Bookmarks")
bookmarks.define_column("comment", "Text")
terms = Groonga::Hash.create(:name => "Terms",
                             :default_tokenizer => "TokenBigram")
terms.define_index_column("content", bookmarks,
                          :source => "Bookmarks.comment")

Overloads:



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'ext/rb-grn-hash.c', line 145

static VALUE
rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
{
    grn_ctx *context;
    grn_obj *key_type = NULL, *value_type = NULL, *table;
    const char *name = NULL, *path = NULL;
    unsigned name_size = 0;
    grn_obj_flags flags = GRN_TABLE_HASH_KEY;
    VALUE rb_table;
    VALUE options, rb_context, rb_name, rb_path, rb_persistent;
    VALUE rb_key_type, rb_value_type, rb_default_tokenizer;
    VALUE rb_sub_records;

    rb_scan_args(argc, argv, "01", &options);

    rb_grn_scan_options(options,
      "context", &rb_context,
      "name", &rb_name,
                        "path", &rb_path,
      "persistent", &rb_persistent,
      "key_type", &rb_key_type,
      "value_type", &rb_value_type,
      "default_tokenizer", &rb_default_tokenizer,
      "sub_records", &rb_sub_records,
      NULL);

    context = rb_grn_context_ensure(&rb_context);

    if (!NIL_P(rb_name)) {
        name = StringValuePtr(rb_name);
  name_size = RSTRING_LEN(rb_name);
  flags |= GRN_OBJ_PERSISTENT;
    }

    if (!NIL_P(rb_path)) {
        path = StringValueCStr(rb_path);
  flags |= GRN_OBJ_PERSISTENT;
    }

    if (RVAL2CBOOL(rb_persistent))
  flags |= GRN_OBJ_PERSISTENT;

    if (NIL_P(rb_key_type)) {
  flags |= GRN_OBJ_KEY_VAR_SIZE;
    } else {
  key_type = RVAL2GRNOBJECT(rb_key_type, &context);
    }

    if (!NIL_P(rb_value_type))
  value_type = RVAL2GRNOBJECT(rb_value_type, &context);

    if (RVAL2CBOOL(rb_sub_records))
  flags |= GRN_OBJ_WITH_SUBREC;

    table = grn_table_create(context, name, name_size, path,
           flags, key_type, value_type);
    if (!table)
  rb_grn_context_check(context, rb_ary_new4(argc, argv));
    rb_table = GRNOBJECT2RVAL(klass, context, table, RB_GRN_TRUE);

    if (!NIL_P(rb_default_tokenizer))
  rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
       rb_default_tokenizer);

    if (rb_block_given_p())
        return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
    else
        return rb_table;
}

Instance Method Details

#search(key, options = nil) ⇒ Groonga::Hash

keyにマッチするレコードのIDがキーに入っているGroonga::Hashを返す。マッチするレコードがない場合は空のGroonga::Hashが返る。

options:resultを指定することにより、そのテーブルにマッチしたレコードIDがキーのレコードを追加することができる。:resultにテーブルを指定した場合は、そのテーブルが返る。

optionsに指定可能な値は以下の通り。

:result

結果を格納するテーブル。

複数のキーで検索し、結果を1つのテーブルに集める。

result = nil
keys = ["morita", "gunyara-kun", "yu"]
keys.each do |key|
  result = users.search(key, :result => result)
end
result.each do |record|
  user = record.key
  p user.key # -> "morita"または"gunyara-kun"または"yu"
end

Returns:



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# File 'ext/rb-grn-hash.c', line 243

static VALUE
rb_grn_hash_search (int argc, VALUE *argv, VALUE self)
{
    grn_rc rc;
    grn_ctx *context;
    grn_obj *table;
    grn_id domain_id;
    grn_obj *key, *domain, *result;
    VALUE rb_key, options, rb_result;

    rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
           &key, &domain_id, &domain,
           NULL, NULL, NULL,
           NULL);

    rb_scan_args(argc, argv, "11", &rb_key, &options);

    RVAL2GRNKEY(rb_key, context, key, domain_id, domain, self);

    rb_grn_scan_options(options,
      "result", &rb_result,
      NULL);

    if (NIL_P(rb_result)) {
  result = grn_table_create(context, NULL, 0, NULL,
          GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC,
          table, 0);
  rb_grn_context_check(context, self);
  rb_result = GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE);
    } else {
  result = RVAL2GRNOBJECT(rb_result, &context);
    }

    rc = grn_obj_search(context, table, key,
      result, GRN_OP_OR, NULL);
    rb_grn_rc_check(rc, self);

    return rb_result;
}