7.15.19. prefix_rk_search
#
7.15.19.1. 概要#
prefix_rk_search
は 前方一致RK検索 を使ってレコードを選択します。
前方一致RK検索を使うには TABLE_PAT_KEY テーブルを作る必要があります。
シーケンシャルスキャンでは prefix_rk_search
を使うことはできません。これはセレクターのみのプロシージャです。
7.15.19.2. 構文#
prefix_rk_search
には2つ引数があります。 column
と query
です。
prefix_rk_search(column, query)
今のところ、 column
は必ず _key
にしなければいけません。
query
は文字列です。
7.15.19.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.19.4. 引数#
必須引数は二つあります。 column
と query
です。
7.15.19.4.1. column
#
今のところ、常に _key
を指定してください。
7.15.19.4.2. query
#
クエリー文字列をローマ字、カタカナ、ひらがなのどれかで指定します。
7.15.19.5. 戻り値#
prefix_rk_search
関数はマッチしたレコードを返します。