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

- English

# 7.19.4. 提案

このセクションでは以下の補完機能について説明します。:

- どのように動作するか
- 使い方
- 学習方法

## 7.19.4.1. どのように動作するか

提案機能は提案する語を計算するために1種類の検索を使います。:

> 1. 学習したデータを共起検索。

### 7.19.4.1.1. 共起検索

共起検索はユーザの入力と関連する語を検索します。共起検索ではユーザの実行したときの検索クエリを使います。このデータはクエリログやアクセスログなどから学習します。

例えば、ユーザが以下のように検索を実行したとします。:

query
search engine
web search realtime

Groongaは以下のような提案ペアを作成します。

入力 | 提案される語
--- | ---
search | search engine
engine | search engine
web | web search realtime
search | web search realtime
realtime | web search realtime

これらのペアは以下の手順で作成します。:

> 1. ユーザの入力をTokenDelimitトークナイザーでトークナイズします。TokenDelimitは空白をトークンの区切りに使います。（例えば、"search engine"は"search"トークンと"engine"トークンの2つのトークンにトークナイズされます。）
> 2. 各トークンについて、トークンと元のクエリからなるペアを作成する。

ユーザが"search"と入力したとき、共起検索は"search engine"と"web search raltime"を返します。これは、"search"が2つの「入力」カラムに含まれていて、対応するそれぞれの「提案される語」カラムの値が"search engine"と"web search realtime"だからです。

## 7.19.4.2. 使い方

Groongaは提案機能を使うために suggest コマンドを用意しています。 --type suggest オプションを使うと提案機能を利用できます。

例えば、"search"と入力した時の提案結果を取得するコマンドは以下の通りです。:

実行例:

    suggest --table item_query --column kana --types suggest --frequency_threshold 1 --query search
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "suggest": [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "_score",
    #           "Int32"
    #         ]
    #       ],
    #       [
    #         "search engine",
    #         1
    #       ],
    #       [
    #         "web search realtime",
    #         1
    #       ]
    #     ]
    #   }
    # ]

## 7.19.4.3. 学習方法

共起検索は学習データを使います。学習データはクエリログやアクセスログなどを元に作成します。学習データを作成するには、タイムスタンプ付きの入力シーケンスと、タイムスタンプ付きの検索実行時の入力内容が必要です。

例えば、ユーザが"engine"で検索したいとします。ユーザが以下のようなシーケンスで検索クエリを入力したとします。:

> 1. 2011-08-10T13:33:25+09:00: search engine （検索実行）
> 2. 2011-08-10T13:33:28+09:00: web search realtime （検索実行）

以下のコマンドで上記の検索実行結果から学習します。:

    load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
    [
    {"sequence": "1", "time": 1312950803.86057, "item": "search engine", "type": "submit"},
    {"sequence": "1", "time": 1312950808.86057, "item": "web search realtime", "type": "submit"}
    ]

## 7.19.4.4. 学習データを抽出する方法

The learning data is stored into item_DATASET and pair_DATASET tables. By using select command for such tables, you can all extract learing data.

Here is the query to extract all learning data:

    select item_DATASET --limit -1
    select pair_DATASET --filter 'freq0 > 0 || freq1 > 0 || freq2 > 0' --limit -1

Without '--limit -1', you can't get all data. In pair table, the valid value of freq0, freq1 and freq2 column must be larger than 0.

Don't execute above query via HTTP request because enourmous number of records are fetched.