このセクションでは以下の補完機能について説明します。:
補完機能は補完される語を計算するために3種類の検索を使います。
- 登録されている語を前方一致RK検索。
- 学習したデータを共起検索。
- 登録されている語を前方一致検索。(実行しないこともある)
RKはローマ字(Romaji)とカタカナ(Katakana)を意味しています。前方一致RK検索は登録されている語をユーザの入力から前方一致検索します。このとき、ユーザの入力はローマ字でもカタカナでもひらがなでも構いません。この機能は日本語を検索するときに便利です。
例えば、"日本"という語が登録されているとします。そして、その読みとして"ニホン"(カタカナにしないといけません)が登録されているとします。このとき、ユーザの入力が"ni"でも"二"でも"に"でも"日本"を見つけることができます。
共起検索は入力途中のユーザのクエリから登録されている語を見つけます。共起検索では検索データベースとしてユーザの入力シーケンスを使います。これはクエリログやアクセスログなどから学習します。
例えば、以下のようなユーザの入力シーケンスがあるとします。
入力 | 検索実行 |
---|---|
s | していない |
se | していない |
sea | していない |
sear | していない |
searc | していない |
search | した |
e | していない |
en | していない |
eng | していない |
engi | していない |
engin | していない |
engine | していない |
enginen | していない(入力ミス!) |
engine | した |
groongaは以下のような補完ペアを作ります。:
入力 | 補完語 |
---|---|
s | search |
se | search |
sea | search |
sear | search |
searc | search |
e | engine |
en | engine |
eng | engine |
engi | engine |
engin | engine |
engine | engine |
enginen | engine |
ユーザが検索を実行する前のすべての入力(例では"s"、"se"など)を検索を実行した語(例では"search")に対応付けます。
厳密に言うとこの説明は正しくありません。なぜならタイムスタンプに関することを省略しているからです。groongaは本当は「ユーザが検索を実行する前のすべての入力を」使いません。厳密には「ユーザが検索を実行する前の1分以内の入力のみ」を使います。検索実行時から1分より前の入力は使われません。
ユーザが"sea"と入力したら、共起検索は"search"を返します。なぜなら、「入力」カラムには"sea"という値があり、対応する「補完語」カラムには"search"という値が入っているからです。
前方一致検索はユーザが入力した文字列から始まる登録済みの語を検索します。この検索は前方一致RK検索とは違ってローマ字、カタカナ、ひらがなを特別扱いしません。
この検索はいつも実行されるわけではありません。この検索は明示的に実行するように指示するか、前方一致RK検索と共起検索の両方がなにもヒットしないときのみ実行されます。
例えば、"search"が登録されているとします。ユーザは"s"、"se"、"sea"、"sear"、"searc"、"search"のどれでも"search"を補完候補として利用できます。
groongaは補完機能を使うために suggest コマンドを用意しています。 --type complete オプションを使うと補完機能を利用できます。
例えば、"en"と入力したときの補完結果を取得するコマンドは以下のようになります。:
実行例:
suggest --table item_query --column kana --types complete --frequency_threshold 1 --query en
# [
# [
# 0,
# 1337566253.89858,
# 0.000355720520019531
# ],
# {
# "complete": [
# [
# 1
# ],
# [
# [
# "_key",
# "ShortText"
# ],
# [
# "_score",
# "Int32"
# ]
# ],
# [
# "engine",
# 1
# ]
# ]
# }
# ]
共起検索は学習データを使います。学習データはクエリログやアクセスログなどを元に作成します。学習データを作成するには、タイムスタンプ付きの入力シーケンスと、タイムスタンプ付きの検索実行時の入力内容が必要です。
例えば、ユーザが"engine"で検索したいとします。ユーザが以下のようなシーケンスで検索クエリを入力したとします。:
- 2011-08-10T13:33:23+09:00: e
- 2011-08-10T13:33:23+09:00: en
- 2011-08-10T13:33:24+09:00: eng
- 2011-08-10T13:33:24+09:00: engi
- 2011-08-10T13:33:24+09:00: engin
- 2011-08-10T13:33:25+09:00: engine (検索実行!)
以下のコマンドでこの入力シーケンスから学習できます。:
load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
[
{"sequence": "1", "time": 1312950803.86057, "item": "e"},
{"sequence": "1", "time": 1312950803.96857, "item": "en"},
{"sequence": "1", "time": 1312950804.26057, "item": "eng"},
{"sequence": "1", "time": 1312950804.56057, "item": "engi"},
{"sequence": "1", "time": 1312950804.76057, "item": "engin"},
{"sequence": "1", "time": 1312950805.86057, "item": "engine", "type": "submit"}
]