# 7.7.2.6. `NormalizerTable`

## 7.7.2.6.1. 概要

バージョン 11.0.4 で追加.

`NormalizerTable` はユーザー定義正規化テーブルを使ってテキストを正規化します。ユーザ定義正規化テーブルはただのテーブルですが、いくつか条件を満たす必要があります。条件は後で説明します。

注釈

正規化されたテキストはユーザー定義正規化テーブルの内容に依存します。このノーマライザーを語彙表で使う場合、ユーザ定義正規化テーブルの内容を更新したらインデックスを作り直す必要があることに注意してください。

## 7.7.2.6.2. 構文

必須な引数と省略可能な引数があります。

必須引数

    NormalizerTable("normalized", "UserDefinedTable.normalized_column")

省略可能引数

    NormalizerTable("normalized", "UserDefinedTable.normalized_column",
                    "target", "target_column")

    NormalizerTable("normalized", "UserDefinedTable.normalized_column",
                    "unicode_version", "13.0.0")

## 7.7.2.6.3. 使い方

### 7.7.2.6.3.1. 簡単な使い方

以下は `NormalizerTable` の例です。

`NormalizerTable` はユーザー定義正規化テーブルを使ってテキストを正規化します。ここでは次のユーザー定義正規化テーブルを使います。

> - `TABLE_PAT_KEY` 型でなければいけません。

> - テーブルのキーの型は `ShortText` でなければいけません。

> - テーブルは少なくとも1つ `ShortText` 型のカラムを持っていなければいけません。

この例で使うスキーマ定義とサンプルデータは以下の通りです。

実行例:

    table_create Normalizations TABLE_PAT_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Normalizations normalized COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Normalizations
    [
    {"_key": "a", "normalized": "<A>"},
    {"_key": "ac", "normalized": "<AC>"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 2]

このユーザー定義正規化テーブルを使うと `a` を `<A>` に、 `oo` を `<OO>` に正規化します。例：

> - `Groonga` -> `Groong<A>`

> - `hack` -> `h<AC>k`

このユーザー定義正規化テーブルを使った `NormalizerTable` の使用例です。

実行例:

    normalize 'NormalizerTable("normalized", "ColumnNormalizations.normalized", "target", "target_column")' "Groonga"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "normalized": "Groong<A>",
    #     "types": [],
    #     "checks": []
    #   }
    # ]
    normalize 'NormalizerTable("normalized", "ColumnNormalizations.normalized", "target", "target_column")' "hack"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "normalized": "h<AC>k",
    #     "types": [],
    #     "checks": []
    #   }
    # ]

### 7.7.2.6.3.2. Unicodeのバージョン

トークナイズやハイライトといったいくつかの内部処理では文字の種類を使います。 `NormalizerTable` はUnicodeを使って文字の種類を提供します。使用するUnicodeのバージョンは unicode_version オプションで指定できます。

以下はUnicode 13.0.0を使う例です。

実行例:

    normalize 'NormalizerTable("normalized", "Normalizations.normalized")' "Groonga" WITH_TYPES
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "normalized": "Groong<A>",
    #     "types": [
    #       "alpha",
    #       "alpha",
    #       "alpha",
    #       "alpha",
    #       "alpha",
    #       "alpha",
    #       "symbol",
    #       "alpha",
    #       "symbol"
    #     ],
    #     "checks": []
    #   }
    # ]

デフォルトのUnicodeのバージョンは5.0.0です。

### 7.7.2.6.3.3. 高度な使い方

正規化対象の文字列を `_key` ではなくカラムに入れることもできます。この場合は対象のカラムに次のようなインデックスカラムを作る必要があります。

> - このインデックスカラムの語彙表の種類は `TABLE_PAT_KEY` でなければいけません。

> - このインデックスカラムの語彙表のキーの型は `ShortText` でなければいけません。

> - このインデックスカラムの語彙表にトークナイザーが設定されていてはいけません。

この使い方の場合はユーザー定義正規化テーブルには `TABLE_NO_KEY` などどんな種類のテーブルを使っても構いません。テーブルの種類をコントロールできない時はこの使い方が便利です。たとえば、PGroongaユーザーはこの使い方しかできません。

この例で使うスキーマ定義とサンプルデータは以下の通りです。

実行例:

    table_create ColumnNormalizations TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create ColumnNormalizations target_column COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create ColumnNormalizations normalized COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Targets TABLE_PAT_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Targets column_normalizations_target_column \
       COLUMN_INDEX ColumnNormalizations target_column
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table ColumnNormalizations
    [
    {"target_column": "a", "normalized": "<A>"},
    {"target_column": "ac", "normalized": "<AC>"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 2]

このユーザー定義正規化テーブルを使うには target オプションを使う必要があります。前述のスキーマは説明のために `target_column` という名前を使っています。一般的に `target_column` の `_column` の部分は冗長です。しかし、引数の名前と値を区別しやすいようにつけてあります。

このユーザー定義正規化テーブルを使った `NormalizerTable` の使用例です。

実行例:

    normalize 'NormalizerTable("normalized", "ColumnNormalizations.normalized", "target", "target_column")' "Groonga"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "normalized": "Groong<A>",
    #     "types": [],
    #     "checks": []
    #   }
    # ]
    normalize 'NormalizerTable("normalized", "ColumnNormalizations.normalized", "target", "target_column")' "hack"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "normalized": "h<AC>k",
    #     "types": [],
    #     "checks": []
    #   }
    # ]

## 7.7.2.6.4. 引数

### 7.7.2.6.4.1. 必須引数

#### 7.7.2.6.4.1.1. `normalized`

このオプションは正規化後のテキストが入っているカラムを指定します。正規化対象のテキストは対応する `_key` カラムに入っているテキストあるいは target で指定したカラムに入っているテキストになります。

このオプションに指定したカラムの値の型は `ShortText` か `Text` か `LongText` でなければいけません。

target を使わない場合、このオプションに指定したカラムのテーブルは次の条件を満たす必要があります。

> - テーブルの種類は `TABLE_PAT_KEY` でなければいけません。

> - テーブルのキーの型は `ShortText` 型でなければいけません。

この場合の使い方は 簡単な使い方 を参照してください。

### 7.7.2.6.4.2. 省略可能引数

#### 7.7.2.6.4.2.1. `target`

このオプションは正規化対象のテキストを持つカラムを指定します。

このオプションに指定したカラムの値の型は `ShortText` か `Text` か `LongText` でなければいけません。

このオプションで指定したカラムのインデックスカラムを作らないといけません。このインデックスカラムとその語彙表は次の条件を満たさないといけません。

> - インデックスカラムはシングルカラムインデックスでもマルチカラムインデックスでもいいです。

> - このインデックスカラムの語彙表の種類は `TABLE_PAT_KEY` でなければいけません。

> - このインデックスカラムの語彙表のキーの型は `ShortText` でなければいけません。

> - このインデックスカラムの語彙表にトークナイザーが設定されていてはいけません。

この場合の使い方は 高度な使い方 を参照してください。

#### 7.7.2.6.4.2.2. `unicode_version`

このオプションは文字の種類を判断するときに使うUnicodeのバージョンを指定します。

デフォルトのUnicodeのバージョンは5.0.0です。

使い方は Unicodeのバージョン を参照してください。

## 7.7.2.6.5. 参考

- normalize