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

- English

# 7.8.1. 概要

Groongaにはテキストをトークナイズするトークナイザーモージュールがあります。次のケースのときにトークナイザーを使います。

> - テキストのインデックスを構築するとき

>   テキストのインデックスを構築するときにトークナイザーを使います。

> - クエリーで検索するとき

>   クエリーで検索するときにトークナイザーを使います。

全文検索ではトークナイザーは重要なモジュールです。トークナイザーを変えることで 適合率と再現率 のトレードオフを調整することができます。

一般的に TokenBigram が適切なトークナイザーです。トークナイザーについてよく知らない場合は TokenBigram を使うことをオススメします。

tokenize コマンドと table_tokenize コマンドを使うことでトークナイザーを試すことができます。 tokenize コマンドを使って TokenBigram トークナイザーを試す例を以下に示します。

実行例:

    tokenize TokenBigram "Hello World"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     {
    #       "position": 0,
    #       "force_prefix": false,
    #       "value": "He"
    #     },
    #     {
    #       "position": 1,
    #       "force_prefix": false,
    #       "value": "el"
    #     },
    #     {
    #       "position": 2,
    #       "force_prefix": false,
    #       "value": "ll"
    #     },
    #     {
    #       "position": 3,
    #       "force_prefix": false,
    #       "value": "lo"
    #     },
    #     {
    #       "position": 4,
    #       "force_prefix": false,
    #       "value": "o "
    #     },
    #     {
    #       "position": 5,
    #       "force_prefix": false,
    #       "value": " W"
    #     },
    #     {
    #       "position": 6,
    #       "force_prefix": false,
    #       "value": "Wo"
    #     },
    #     {
    #       "position": 7,
    #       "force_prefix": false,
    #       "value": "or"
    #     },
    #     {
    #       "position": 8,
    #       "force_prefix": false,
    #       "value": "rl"
    #     },
    #     {
    #       "position": 9,
    #       "force_prefix": false,
    #       "value": "ld"
    #     },
    #     {
    #       "position": 10,
    #       "force_prefix": false,
    #       "value": "d"
    #     }
    #   ]
    # ]

「トークナイズ」はテキストから0個以上のトークンを抽出する処理です。「トークナイズ」する方法はいくつかあります。

例えば、バイグラムというトークナイズ方法では `Hello World` は次のトークンにトークナイズされます。

> - `He`
> - `el`
> - `ll`
> - `lo`
> - `o_` （ `_` は空白文字という意味）
> - `_W` （ `_` は空白文字という意味）
> - `Wo`
> - `or`
> - `rl`
> - `ld`

上記の例では、 `Hello World` から10個のトークンを抽出しました。

例えば、空白区切りのトークナイズ方法では `Hello World` は次のトークンにトークナイズされます。

> - `Hello`
> - `World`

上記の例では、`Hello World` から2つのトークンを抽出しました。

トークンは検索時のキーとして使われます。使用したトークナイズ方法で抽出したトークンでしかインデックス化されたドキュメントを探すことはできません。例えば、トークナイズ方法としてバイグラムを使った場合は `ll` で `Hello World` を見つけることができます。しかし、空白区切りのトークナイズ方法を使ったときは `ll` で `Hello World` を見つけることはできません。なぜなら、空白区切りのトークナイズ方法は `ll` というトークンを抽出していないからです。空白区切りのトークナイズ方法は `Hello` というトークンと `World` というトークンしか抽出していません。

一般的に、小さいトークンを生成するトークナイズ方法は再現率が高い代わりに適合率が低くなりがちです。一方、大きいトークンを生成するトークナイズ方法は適合率が高い代わりに再現率が低くなりがちです。

例えば、バイグラムというトークナイズ方法では `or` で `Hello World` と `A or B` を検索できます。しかし、「論理和」を検索したい人にとっては `Hello World` は不要な結果です。これは、適合率が下がったということです。しかし、再現率は上がっています。

空白区切りのトークナイズ方法を使った場合は `or` で `A or B` だけが見つかります。なぜなら、空白区切りのトークナイズ方法では `World` は `World` という1つのトークンだけにトークナイズされるからです。これは、「論理和」を探したい人にとっては適合率が挙がっています。しかし、 `Hello World` も `or` を含んでいるのに見つかっていないので再現率が下がっています。