Class: Groonga::PatriciaTrie

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

Overview

各レコードをパトリシアトライで管理するテーブル。ハッシュ テーブルに比べて完全一致検索の速度がやや遅いが、前方一致 検索・共通接頭辞探索などの検索ができる。またカーソルを用 いてキーの昇降順にレコードを取り出すことができる。

Class Method Summary collapse

  • .create ⇒ Object

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

Instance Method Summary collapse

  • #open_near_cursor ⇒ Object

    key に近い順にレコードを取り出すカーソルを生成して返す。 ブロックを指定すると、そのブロックに生成したカーソルが渡され、 ブロックを抜けると自動的にカーソルが破棄される。.

  • #open_prefix_cursor ⇒ Object

    prefix に前方一致検索をするカーソルを生成して返す。ブロッ クを指定すると、そのブロックに生成したカーソルが渡され、ブ ロックを抜けると自動的にカーソルが破棄される。.

  • #open_rk_cursor ⇒ Object

    table のキーはカタカナである必要がある。また、エンコーディ ングはUTF-8である必要がある。ローマ字やひらがなで key を指 定しても、 key に対応するカタカナのキーを検索するカーソル を生成して返す。ブロックを指定すると、そのブロックに生成し たカーソルが渡され、ブロックを抜けると自動的にカーソルが破 棄される。.

  • #prefix_search(prefix) ⇒ Groonga::Hash

    キーが prefix に前方一致するレコードのIDがキーに入っている Hash を返す。マッチするレコードがない場合は空の Hash が返る。.

  • #register_key_with_sis? ⇒ Boolean

    キーを登録するときに文字列の全suffixも一緒に登録する場合 は +true+ 、登録しない場合は +false+ を返す。.

  • #scan ⇒ Object

    string を走査し、 patricia_trie 内に格納されているキーに マッチした部分文字列の情報をブロックに渡す。複数のキーが マッチする場合は最長一致するキーを優先する。.

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

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

  • #tag_keys(text, options = {}) ⇒ Object

    text を走査し、レコードのキーとマッチする部分文字列ごとに そのレコードが record として、その部分文字列が word として、 ブロックが呼び出される。ブロックから返された文字列が元の部 分文字列と置換される。全てのヒットに対してのその置換処理が 行われた文字列が返される。.

Methods included from Table::KeySupport

#[], #[]=, #add, #column_value, #default_tokenizer, #default_tokenizer=, #delete, #has_key?, #id, #inspect, #key, #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::PatriciaTrie .create(options = {}) {|table| ... } ⇒ Object

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

Examples:

#無名一時テーブルを生成する。
Groonga::PatriciaTrie.create

#無名永続テーブルを生成する。
Groonga::PatriciaTrie.create(:path => "/tmp/hash.grn")

#名前付き永続テーブルを生成する。ただし、ファイル名は気に
#しない。
Groonga::PatriciaTrie.create(:name => "Bookmarks",
                             :persistent => true)

#それぞれのレコードに512バイトの値を格納できる無名一時テー
#ブルを生成する。
Groonga::PatriciaTrie.create(:value => 512)

#キーとして文字列を使用する無名一時テーブルを生成する。
Groonga::PatriciaTrie.create(:key_type => Groonga::Type::SHORT_TEXT)

#キーとして文字列を使用する無名一時テーブルを生成する。
#(キーの種類を表すオブジェクトは文字列で指定。)
Groonga::PatriciaTrie.create(:key_type => "ShortText")

#キーとしてBookmarksテーブルのレコードを使用す
#る無名一時テーブルを生成する。
bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks")
Groonga::PatriciaTrie.create(:key_type => bookmarks)

#キーとしてBookmarksテーブルのレコードを使用す
#る無名一時テーブルを生成する。
#(テーブルは文字列で指定。)
Groonga::PatriciaTrie.create(:name => "Bookmarks")
Groonga::PatriciaTrie.create(:key_type => "Bookmarks")

#全文検索用のトークンをバイグラムで切り出す無名一時テーブ
#ルを生成する。
bookmarks = Groonga::PatriciaTrie.create(:name => "Bookmarks")
bookmarks.define_column("comment", "Text")
terms = Groonga::PatriciaTrie.create(:name => "Terms",
                                     :default_tokenizer => "TokenBigram")
terms.define_index_column("content", bookmarks,
                          :source => "Bookmarks.comment")

Overloads:

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

    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

    • :name (Object)

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

    • :path (Object)

      テーブルを保存するパス。パスを指定すると永続テーブルとな り、プロセス終了後もレコードは保持される。次回起動時に 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_with_sis (Object)

      +true+ を指定するとキーの文字列の全suffixが自動的に登 録される。

    • :key_type (Object)

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

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

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

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

    • :value_type (Object)

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

      参考: Type.new

    • :default_tokenizer (Object)

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

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

      The token filters to be used in the table.

    • :sub_records (Object)

      +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

    • :name (Object)

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

    • :path (Object)

      テーブルを保存するパス。パスを指定すると永続テーブルとな り、プロセス終了後もレコードは保持される。次回起動時に 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_with_sis (Object)

      +true+ を指定するとキーの文字列の全suffixが自動的に登 録される。

    • :key_type (Object)

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

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

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

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

    • :value_type (Object)

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

      参考: Type.new

    • :default_tokenizer (Object)

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

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

      The token filters to be used in the table.

    • :sub_records (Object)

      +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)


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
249
250
# File 'ext/groonga/rb-grn-patricia-trie.c', line 162

static VALUE
rb_grn_patricia_trie_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_PAT_KEY;
    VALUE rb_table;
    VALUE options, rb_context, rb_name, rb_path, rb_persistent;
    VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
    VALUE rb_value_type;
    VALUE 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_with_sis", &rb_key_with_sis,
                        "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_with_sis))
        flags |= GRN_OBJ_KEY_WITH_SIS;

    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

#open_near_cursor(key, options = {}) ⇒ Groonga::PatriciaTrieCursor #open_near_cursor(key, options = {}) {|cursor| ... } ⇒ Object

key に近い順にレコードを取り出すカーソルを生成して返す。 ブロックを指定すると、そのブロックに生成したカーソルが渡され、 ブロックを抜けると自動的にカーソルが破棄される。

Overloads:

  • #open_near_cursor(key, options = {}) ⇒ Groonga::PatriciaTrieCursor

    Parameters:

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

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

    Options Hash (options):

    • :size (Object)

      size バイト以降のデータが同じキーのレコードに限定する。

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目 からレコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定され たものとみなす。

    • :greater_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Returns:

  • #open_near_cursor(key, options = {}) {|cursor| ... } ⇒ Object

    Parameters:

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

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

    Options Hash (options):

    • :size (Object)

      size バイト以降のデータが同じキーのレコードに限定する。

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目 からレコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定され たものとみなす。

    • :greater_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Yields:

    • (cursor)


841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
# File 'ext/groonga/rb-grn-patricia-trie.c', line 841

static VALUE
rb_grn_patricia_trie_open_near_cursor (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context = NULL;
    grn_table_cursor *cursor;
    VALUE rb_cursor;

    cursor = rb_grn_patricia_trie_open_grn_near_cursor(argc, argv,
                                                       self, &context, GRN_CURSOR_RK);
    rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
    rb_iv_set(rb_cursor, "@table", self); /* FIXME: cursor should mark table */
    if (rb_block_given_p())
        return rb_ensure(rb_yield, rb_cursor, rb_grn_object_close, rb_cursor);
    else
        return rb_cursor;
}

#open_prefix_cursor(prefix, options = {}) ⇒ Groonga::PatriciaTrieCursor #open_prefix_cursor(prefix, options = {}) {|cursor| ... } ⇒ Object

prefix に前方一致検索をするカーソルを生成して返す。ブロッ クを指定すると、そのブロックに生成したカーソルが渡され、ブ ロックを抜けると自動的にカーソルが破棄される。

Overloads:

  • #open_prefix_cursor(prefix, options = {}) ⇒ Groonga::PatriciaTrieCursor

    Parameters:

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

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

    Options Hash (options):

    • :key_bytes (Object)

      prefix のサイズ(byte)

    • :key_bits (Object)

      prefix のサイズ(bit)

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目 からレコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定され たものとみなす。

    • :order (Object)

      +:asc+ または +:ascending+ を指定すると昇順にレコードを取 り出す。 +:desc+ または +:descending+ を指定すると降順にレコードを 取り出す。

    • :order_by (Object) — default: :id

      +:id+ を指定するとID順にレコードを取り出す。(デフォルト) +:key+指定するとキー順にレコードを取り出す。

    • :greater_than (Object)

      +true+ を指定すると prefix で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると prefix で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Returns:

  • #open_prefix_cursor(prefix, options = {}) {|cursor| ... } ⇒ Object

    Parameters:

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

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

    Options Hash (options):

    • :key_bytes (Object)

      prefix のサイズ(byte)

    • :key_bits (Object)

      prefix のサイズ(bit)

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目 からレコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定され たものとみなす。

    • :order (Object)

      +:asc+ または +:ascending+ を指定すると昇順にレコードを取 り出す。 +:desc+ または +:descending+ を指定すると降順にレコードを 取り出す。

    • :order_by (Object) — default: :id

      +:id+ を指定するとID順にレコードを取り出す。(デフォルト) +:key+指定するとキー順にレコードを取り出す。

    • :greater_than (Object)

      +true+ を指定すると prefix で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると prefix で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Yields:

    • (cursor)


628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
# File 'ext/groonga/rb-grn-patricia-trie.c', line 628

static VALUE
rb_grn_patricia_trie_open_prefix_cursor (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context = NULL;
    grn_table_cursor *cursor;
    VALUE rb_cursor;

    cursor = rb_grn_patricia_trie_open_grn_prefix_cursor(argc, argv,
                                                         self, &context);
    rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
    rb_iv_set(rb_cursor, "@table", self); /* FIXME: cursor should mark table */
    if (rb_block_given_p())
        return rb_ensure(rb_yield, rb_cursor, rb_grn_object_close, rb_cursor);
    else
        return rb_cursor;
}

#open_rk_cursor(key, options = {}) ⇒ Groonga::PatriciaTrieCursor #open_rk_cursor(key, options = {}) {|cursor| ... } ⇒ Object

table のキーはカタカナである必要がある。また、エンコーディ ングはUTF-8である必要がある。ローマ字やひらがなで key を指 定しても、 key に対応するカタカナのキーを検索するカーソル を生成して返す。ブロックを指定すると、そのブロックに生成し たカーソルが渡され、ブロックを抜けると自動的にカーソルが破 棄される。

Overloads:

  • #open_rk_cursor(key, options = {}) ⇒ Groonga::PatriciaTrieCursor

    Parameters:

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

      pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :key_bytes (Object)

      _key_のサイズ(byte)

    • :key_bits (Object)

      _key_のサイズ(bit)(現在は未サポート)

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目から レコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定されたものとみなす。

    • :greater_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Returns:

  • #open_rk_cursor(key, options = {}) {|cursor| ... } ⇒ Object

    Parameters:

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

      pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :key_bytes (Object)

      _key_のサイズ(byte)

    • :key_bits (Object)

      _key_のサイズ(bit)(現在は未サポート)

    • :offset (Object)

      該当する範囲のレコードのうち、(0ベースで) :offset 番目から レコードを取り出す。

    • :limit (Object)

      該当する範囲のレコードのうち、 :limit 件のみを取り出す。 省略された場合または-1が指定された場合は、全件が指定されたものとみなす。

    • :greater_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    • :less_than (Object)

      +true+ を指定すると key で指定した値に一致した [ +key+ ] を 範囲に含まない。

    Yields:

    • (cursor)


740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
# File 'ext/groonga/rb-grn-patricia-trie.c', line 740

static VALUE
rb_grn_patricia_trie_open_rk_cursor (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context = NULL;
    grn_table_cursor *cursor;
    VALUE rb_cursor;

    cursor = rb_grn_patricia_trie_open_grn_rk_cursor(argc, argv,
                                                                self, &context);
    rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
    rb_iv_set(rb_cursor, "@table", self); /* FIXME: cursor should mark table */
    if (rb_block_given_p())
        return rb_ensure(rb_yield, rb_cursor, rb_grn_object_close, rb_cursor);
    else
        return rb_cursor;
}

#prefix_search(prefix) ⇒ Groonga::Hash

キーが prefix に前方一致するレコードのIDがキーに入っている Hash を返す。マッチするレコードがない場合は空の Hash が返る。

Returns:



452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
# File 'ext/groonga/rb-grn-patricia-trie.c', line 452

static VALUE
rb_grn_patricia_trie_prefix_search (VALUE self, VALUE rb_prefix)
{
    grn_ctx *context;
    grn_obj *table, *key, *domain, *result;
    grn_id domain_id;
    VALUE rb_result;

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

    result = grn_table_create(context, NULL, 0, NULL,
                              GRN_OBJ_TABLE_HASH_KEY,
                              table, 0);
    rb_grn_context_check(context, self);
    rb_result = GRNOBJECT2RVAL(Qnil, context, result, GRN_TRUE);

    GRN_BULK_REWIND(key);
    RVAL2GRNKEY(rb_prefix, context, key, domain_id, domain, self);
    grn_pat_prefix_search(context, (grn_pat *)table,
                          GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key),
                          (grn_hash *)result);
    rb_grn_context_check(context, self);

    return rb_result;
}

#register_key_with_sis?Boolean

キーを登録するときに文字列の全suffixも一緒に登録する場合 は +true+ 、登録しない場合は +false+ を返す。

Returns:

  • (Boolean)


487
488
489
490
491
492
493
494
495
496
497
# File 'ext/groonga/rb-grn-patricia-trie.c', line 487

static VALUE
rb_grn_patricia_trie_register_key_with_sis_p (VALUE self)
{
    grn_obj *table;

    rb_grn_table_key_support_deconstruct(SELF(self), &table, NULL,
                                         NULL, NULL, NULL,
                                         NULL, NULL, NULL,
                                         NULL);
    return CBOOL2RVAL(table->header.flags & GRN_OBJ_KEY_WITH_SIS);
}

#scan(string) ⇒ Array #scan(string) {|record, word, start, length| ... } ⇒ Object

string を走査し、 patricia_trie 内に格納されているキーに マッチした部分文字列の情報をブロックに渡す。複数のキーが マッチする場合は最長一致するキーを優先する。

ブロックを指定しない場合は、マッチした部分文字列の情報を まとめて配列として返す。

Examples:

words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
                                     :normalizer => "NormalizerAuto")
words.add("リンク")
adventure_of_link = words.add('リンクの冒険')
words.add('冒険')
gaxtu = words.add('ガッ')
muteki = words.add('MUTEKI')

text = 'muTEki リンクの冒険 ミリバール ガッ'
words.scan(text).each do |record, word, start, length|
  p [record.key, word, start, length]
    # -> ["MUTEKI", "muTEki", 0, 6]
    # -> ["リンクの冒険", "リンクの冒険", 7, 18]
    # -> ["ガッ", "ガッ", 42, 6]
end

words.scan(text)
  # -> [[muteki, "muTEki", 0, 6],
  #     [adventure_of_link, "リンクの冒険", 7, 18],
  #     [gaxtu, "ガッ", 42, 6]]

Overloads:

  • #scan(string) ⇒ Array

    Returns:

  • #scan(string) {|record, word, start, length| ... } ⇒ Object

    Yields:

    • (record, word, start, length)

    Yield Parameters:

    • record

      マッチしたキーの Record

    • word

      マッチした部分文字列。

    • start

      string 内での word の出現位置。(バイト単位)

    • length

      word の長さ。(バイト単位)



383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# File 'ext/groonga/rb-grn-patricia-trie.c', line 383

static VALUE
rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
{
    grn_ctx *context;
    grn_obj *table;
    VALUE rb_result = Qnil;
    grn_pat_scan_hit hits[1024];
    const char *string;
    long string_length;
    grn_bool block_given;

    string = StringValuePtr(rb_string);
    string_length = RSTRING_LEN(rb_string);

    rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
                                         NULL, NULL, NULL,
                                         NULL, NULL, NULL,
                                         NULL);

    block_given = rb_block_given_p();
    if (!block_given)
        rb_result = rb_ary_new();

    while (string_length > 0) {
        const char *rest;
        int i, n_hits;
        unsigned int previous_offset = 0;

        n_hits = grn_pat_scan(context, (grn_pat *)table,
                              string, string_length,
                              hits, sizeof(hits) / sizeof(*hits),
                              &rest);
        for (i = 0; i < n_hits; i++) {
            VALUE record, term, matched_info;

            if (hits[i].offset < previous_offset)
                continue;

            record = rb_grn_record_new(self, hits[i].id, Qnil);
            term = rb_grn_context_rb_string_new(context,
                                                string + hits[i].offset,
                                                hits[i].length);
            matched_info = rb_ary_new_from_args(4,
                                                record,
                                                term,
                                                UINT2NUM(hits[i].offset),
                                                UINT2NUM(hits[i].length));
            if (block_given) {
                rb_yield(matched_info);
            } else {
                rb_ary_push(rb_result, matched_info);
            }
            previous_offset = hits[i].offset;
        }
        string_length -= rest - string;
        string = rest;
    }

    return rb_result;
}

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

key にマッチするレコードのIDがキーに入っている Hash を返す。 マッチするレコードがない場合は空の 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)

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

  • :operator (Object) — default: Groonga::Operator::OR

    マッチしたレコードをどのように扱うか。指定可能な値は以 下の通り。

    • Groonga::Operator::OR := マッチしたレコードを追加。すでにレコードが追加され ている場合は何もしない。 =:
    • Groonga::Operator::AND := マッチしたレコードのスコアを増加。マッチしなかった レコードを削除。 =:
    • Groonga::Operator::AND_NOT := マッチしたレコードを削除。 =:
    • Groonga::Operator::ADJUST := マッチしたレコードのスコアを増加。 =:
    • +:type+ := ????? =:

Returns:



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# File 'ext/groonga/rb-grn-patricia-trie.c', line 294

static VALUE
rb_grn_patricia_trie_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;
    grn_operator operator;
    grn_search_optarg search_options;
    grn_bool search_options_is_set = GRN_FALSE;
    VALUE rb_key, options, rb_result, rb_operator, rb_type;

    memset(&search_options, 0, sizeof(grn_search_optarg));

    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,
                        "operator", &rb_operator,
                        "type", &rb_type,
                        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);
    }

    operator = RVAL2GRNOPERATOR(rb_operator);

    rc = grn_obj_search(context, table, key,
                        result, operator,
                        search_options_is_set ? &search_options : NULL);
    rb_grn_rc_check(rc, self);

    return rb_result;
}

#tag_keys(text, options = {}) ⇒ Object

text を走査し、レコードのキーとマッチする部分文字列ごとに そのレコードが record として、その部分文字列が word として、 ブロックが呼び出される。ブロックから返された文字列が元の部 分文字列と置換される。全てのヒットに対してのその置換処理が 行われた文字列が返される。

Examples:

include ERB::Util
Groonga::Context.default_options = {:encoding => "utf-8"}
words = Groonga::PatriciaTrie.create(:key_type => "ShortText",
                                     :normalizer => "NormalizerAuto")
words.add('ガッ')
words.add('MUTEKI')

text = 'muTEki マッチしない <> ガッ'
other_text_handler = Proc.new do |string|
  h(string)
end
options = {
  :other_text_handler => other_text_handler,
}
words.tag_keys(text, options) do |record, word|
  "<span class=\"keyword\">#{h(word)}(#{h(record.key)})</span>\n"
end
# =>
# "<span class=\"keyword\">muTEki(muteki)</span>\n" +
# " マッチしない &lt;&gt; " +
# "<span class=\"keyword\">ガッ(ガッ)</span>\n"

Parameters:

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

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

Options Hash (options):

  • :other_text_handler (Proc)

    The other_text_handler

    マッチした部分文字列の前後の文字列を変換するProcを指定する。



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/groonga/patricia-trie.rb', line 54

def tag_keys(text, options={})
  options ||= {}
  other_text_handler = options[:other_text_handler]
  position = 0
  result = ''
  if text.respond_to?(:encoding)
    encoding = text.encoding
    bytes = text.dup.force_encoding("ascii-8bit")
  else
    encoding = nil
    bytes = text
  end
  scan(text) do |record, word, start, length|
    previous_text = bytes[position...start]
    previous_text.force_encoding(encoding) if encoding
    if other_text_handler
      previous_text = other_text_handler.call(previous_text)
    end
    result << previous_text
    result << yield(record, word)
    position = start + length
  end
  last_text = bytes[position..-1]
  unless last_text.empty?
    last_text.force_encoding(encoding) if encoding
    last_text = other_text_handler.call(last_text) if other_text_handler
    result << last_text
  end
  result
end