Class: Groonga::Hash

Inherits:
Table show all
Includes:
Table::KeySupport
Defined in:
ext/groonga/rb-grn-hash.c,
ext/groonga/rb-grn-hash.c

Overview

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

Class Method Summary collapse

  • .create ⇒ Object

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

Instance Method Summary collapse

Methods included from Table::KeySupport

#[], #[]=, #add, #column_value, #default_tokenizer, #default_tokenizer=, #delete, #has_key?, #id, #inspect, #key, #normalize_key?, #normalizer, #normalizer=, #reindex, #set_column_value, #set_value, #support_key?, #token_filters, #token_filters=, #tokenize, #value

Methods included from EncodingSupport

#encoding

Methods inherited from Table

#[], #clear_lock, #column, #column_value, #columns, #define_column, #define_index_column, #defrag, #delete, #difference!, #disk_usage, #each, #each_sub_record, #empty?, #exist?, #geo_sort, #group, #have_column?, #have_n_sub_records_space?, #initialize, #inspect, #intersection!, #lock, #locked?, #merge!, #open_cursor, #paginate, #records, #rename, #select, #set_column_value, #set_value, #size, #sort, #support_key?, #support_sub_records?, #support_value?, #truncate, #union!, #unlock, #value

Methods included from Flushable

#flush

Methods inherited from Object

#==, #[], #[]=, #accessor?, #append, #builtin?, #close, #closed?, #column?, #dirty?, #domain, #function_procedure?, #id, #index_column?, #inspect, #key_accessor?, #last_modified, #name, #path, #persistent?, #prepend, #procedure?, #range, #reference_column?, #remove, #scorer_procedure?, #selector_only_procedure?, #selector_procedure?, #table?, #temporary?, #touch, #unlink, #window_function_procedure?

Constructor Details

This class inherits a constructor from Groonga::Table

Class Method Details

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

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

Examples:

#無名一時テーブルを生成する。
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:

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

    Parameters:

    • options (::Hash) (defaults to: {})

      The name and value pairs. Omitted names are initialized as the default value

    Options Hash (options):

    • :context (Groonga::Context) — default: Groonga::Context.default

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

    • :name (Groonga::Context#[])

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

    • :path (Groonga::Context#[])

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

    • :persistent (Object)

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

    • :key_normalize (Object) — default: false

      Keys are normalized if this value is @true@.

      @deprecated Use @:normalizer => “NormalizerAuto”@ instead.

    • :key_large (Boolean) — default: false

      It specifies whether total key size is large or not. The default total key size is 4GiB. Large total key size is 1TiB.

      @since 6.0.1

    • :key_type (Object)

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

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

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

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

    • :value_type (Object)

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

      参考: Type.new

    • :default_tokenizer (Groonga::IndexColumn)

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

    • :token_filters (::Array<String, Groonga::Procedure>, nil) — default: nil

      The token filters to be used in the table.

    • :sub_records (Groonga::Record#n_sub_records)

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

    • :normalizer (String, Groonga::Procedure, nil)

      The normalizer that is used by IndexColumn. You can specify this by normalizer name as String such as @”NormalizerAuto”@ or normalizer object.

    Returns:

  • .create(options = {}) {|table| ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: {})

      The name and value pairs. Omitted names are initialized as the default value

    Options Hash (options):

    • :context (Groonga::Context) — default: Groonga::Context.default

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

    • :name (Groonga::Context#[])

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

    • :path (Groonga::Context#[])

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

    • :persistent (Object)

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

    • :key_normalize (Object) — default: false

      Keys are normalized if this value is @true@.

      @deprecated Use @:normalizer => “NormalizerAuto”@ instead.

    • :key_large (Boolean) — default: false

      It specifies whether total key size is large or not. The default total key size is 4GiB. Large total key size is 1TiB.

      @since 6.0.1

    • :key_type (Object)

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

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

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

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

    • :value_type (Object)

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

      参考: Type.new

    • :default_tokenizer (Groonga::IndexColumn)

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

    • :token_filters (::Array<String, Groonga::Procedure>, nil) — default: nil

      The token filters to be used in the table.

    • :sub_records (Groonga::Record#n_sub_records)

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

    • :normalizer (String, Groonga::Procedure, nil)

      The normalizer that is used by IndexColumn. You can specify this by normalizer name as String such as @”NormalizerAuto”@ or normalizer object.

    Yields:

    • (table)


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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'ext/groonga/rb-grn-hash.c', line 160

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_table_flags flags = GRN_OBJ_TABLE_HASH_KEY;
    VALUE rb_table;
    VALUE options, rb_context, rb_name, rb_path, rb_persistent;
    VALUE rb_key_normalize;
    VALUE rb_key_large;
    VALUE rb_key_type, rb_value_type, rb_default_tokenizer;
    VALUE rb_token_filters;
    VALUE rb_sub_records;
    VALUE rb_normalizer;

    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_normalize", &rb_key_normalize,
                        "key_large", &rb_key_large,
                        "key_type", &rb_key_type,
                        "value_type", &rb_value_type,
                        "default_tokenizer", &rb_default_tokenizer,
                        "token_filters", &rb_token_filters,
                        "sub_records", &rb_sub_records,
                        "normalizer", &rb_normalizer,
                        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 (RVAL2CBOOL(rb_key_normalize))
        flags |= GRN_OBJ_KEY_NORMALIZE;

    if (RVAL2CBOOL(rb_key_large))
        flags |= GRN_OBJ_KEY_LARGE;

    if (NIL_P(rb_key_type)) {
        key_type = grn_ctx_at(context, GRN_DB_SHORT_TEXT);
    } 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_new_from_values(argc, argv));
    rb_table = GRNOBJECT2RVAL(klass, context, table, GRN_TRUE);

    if (!NIL_P(rb_default_tokenizer))
        rb_funcall(rb_table, rb_intern("default_tokenizer="), 1,
                   rb_default_tokenizer);
    if (!NIL_P(rb_token_filters))
        rb_funcall(rb_table, rb_intern("token_filters="), 1,
                   rb_token_filters);
    if (!NIL_P(rb_normalizer))
        rb_funcall(rb_table, rb_intern("normalizer="), 1,
                   rb_normalizer);

    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+ にテーブルを指定した場合は、そのテーブルが返る。

Examples:

複数のキーで検索し、結果を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

Parameters:

  • options (::Hash) (defaults to: nil)

    The name and value pairs. Omitted names are initialized as the default value

Options Hash (options):

  • :result (Object)

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

Returns:



277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
# File 'ext/groonga/rb-grn-hash.c', line 277

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, 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;
}