# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.15.15. `prefix_rk_search`

## 7.15.15.1. 概要

`prefix_rk_search` は 前方一致RK検索 を使ってレコードを選択します。

前方一致RK検索を使うには TABLE_PAT_KEY テーブルを作る必要があります。

シーケンシャルスキャンでは `prefix_rk_search` を使うことはできません。これはセレクターのみのプロシージャです。

## 7.15.15.2. 構文

`prefix_rk_search` には2つ引数があります。 `column` と `query` です。

    prefix_rk_search(column, query)

今のところ、 `column` は必ず `_key` にしなければいけません。

`query` は文字列です。

## 7.15.15.3. 使い方

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

実行例:

    table_create Readings TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Readings
    [
    {"_key": "ニホン"},
    {"_key": "ニッポン"},
    {"_key": "ローマジ"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 3]

以下は簡単な `prefix_rk_search()` 関数の使い方です。この使い方では `ni` で `ニホン` と `ニッポン` を検索しています。

実行例:

    select Readings --filter 'prefix_rk_search(_key, "ni")'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         2,
    #         "ニッポン"
    #       ],
    #       [
    #         1,
    #         "ニホン"
    #       ]
    #     ]
    #   ]
    # ]

sub_filter と組み合わせることで 補完 のような機能を実現することができます。

レコードが補完候補となるテーブルを作成します。各レコードには0個以上の読みがあります。読みは `Readings` テーブルに格納します。 `Readings` テーブルに `Items.readings` 用のインデックスカラムを定義することを忘れないでください。このインデックスカラムは sub_filter で必要になります。

実行例:

    table_create Items TABLE_HASH_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Items readings COLUMN_VECTOR Readings
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Readings items_index COLUMN_INDEX Items readings
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Items
    [
    {"_key": "日本",     "readings": ["ニホン", "ニッポン"]},
    {"_key": "ローマ字", "readings": ["ローマジ"]},
    {"_key": "漢字",     "readings": ["カンジ"]}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 3]

`niho` で `Items` テーブルの中にある `日本` レコードを見つけることができます。なぜなら、 `niho` で前方一致RK検索をすると `ニホン` という読みが見つかり、 `ニホン` という読みは `日本` レコードの読みの1つだからです。

実行例:

    select Items \
     --filter 'sub_filter(readings, "prefix_rk_search(_key, \\"niho\\")")'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "readings",
    #           "Readings"
    #         ]
    #       ],
    #       [
    #         1,
    #         "日本",
    #         [
    #           "ニホン",
    #           "ニッポン"
    #         ]
    #       ]
    #     ]
    #   ]
    # ]

読みがない補完候補をサポートするために 前方一致検索演算子 も組み合わせる必要があります。

読みがない補完候補を1つ追加します。

実行例:

    load --table Items
    [
    {"_key": "nihon", "readings": []}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 1]

読みがない補完候補をサポートするために 前方一致検索演算子 を組み合わせます。

実行例:

    select Items \
     --filter 'sub_filter(readings, "prefix_rk_search(_key, \\"niho\\")") || _key @^ "niho"'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "readings",
    #           "Readings"
    #         ]
    #       ],
    #       [
    #         1,
    #         "日本",
    #         [
    #           "ニホン",
    #           "ニッポン"
    #         ]
    #       ],
    #       [
    #         4,
    #         "nihon",
    #         []
    #       ]
    #     ]
    #   ]
    # ]

多くの場合、補完時は大文字小文字を無視して検索したいものです。その場合は、 `--normalizer NormalizerAuto` と `label` カラムを使います。

実行例:

    table_create LooseItems TABLE_HASH_KEY ShortText --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create LooseItems label COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create LooseItems readings COLUMN_VECTOR Readings
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Readings loose_items_index COLUMN_INDEX LooseItems readings
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table LooseItems
    [
    {"_key": "日本",     "label": "日本",     "readings": ["ニホン", "ニッポン"]},
    {"_key": "ローマ字", "label": "ローマ字", "readings": ["ローマジ"]},
    {"_key": "漢字",     "label": "漢字",     "readings": ["カンジ"]},
    {"_key": "Nihon",    "label": "日本",     "readings": []}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]

表示するときは `LooseItems.label` を使います。

実行例:

    select LooseItems \
     --filter 'sub_filter(readings, "prefix_rk_search(_key, \\"nIhO\\")") || _key @^ "nIhO"' \
     --output_columns '_key,label'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "label",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         "日本",
    #         "日本"
    #       ],
    #       [
    #         "nihon",
    #         "日本"
    #       ]
    #     ]
    #   ]
    # ]

## 7.15.15.4. 引数

必須引数は二つあります。 `column` と `query` です。

### 7.15.15.4.1. `column`

今のところ、常に `_key` を指定してください。

### 7.15.15.4.2. `query`

クエリー文字列をローマ字、カタカナ、ひらがなのどれかで指定します。

## 7.15.15.5. 戻り値

`prefix_rk_search` 関数はマッチしたレコードを返します。

## 7.15.15.6. 参考

- 前方一致RK検索
- sub_filter