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

- English page

# 7.7. ノーマライザー

## 7.7.1. 概要

Groongaには正規化をするノーマライザーモジュールがあります。これはテキストをトークナイズするときとテーブルのキーを保存するときに使われます。例えば、正規化をした後は `A` と `a` は同じ文字として扱われます。

ノーマライザーモジュールはプラグインとして追加できます。ノーマライザープラグインをGroongaに追加することでテキストの正規化方法をカスタマイズできます。

ノーマライザーモジュールはテーブルに関連付いています。テーブルは0個か1個のノーマライザーモジュールを持つことができます。 table_create の normalizer オプションでテーブルにノーマライザーオプションを関連付けることができます。

以下は `NormalizerAuto` ノーマライザーモジュールを使う `table_create` の例です。

実行例:

    table_create Dictionary TABLE_HASH_KEY ShortText --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]

注釈

Groonga 2.0.9以前には `table_create` に `--normalizer` オプションはありません。代わりに `KEY_NORMALIZE` フラグを使っていました。

Groonga 2.1.0以降で古いデータベースを開くことができます。ここでいう古いデータベースとはGroonga 2.0.9以前で作ったデータベースということです。しかし、一度新しいGroongaで開いたデータベースを2.0.9以前のGroongaで開くことはできません。一度 Groonga 2.1.0以降のGroongaでデータベースを開くと、 `KEY_NORMALIZE` フラグ情報がノーマライザー情報に変換されます。そのため、2.0.9以前のGroongaは、一度Groonga 2.1.0以降で開いたデータベース内から `KEY_NROMALIZE` フラグの情報を見つけることができません。

ノーマライザーモジュールを持っているテーブルのキーは正規化されます。

実行例:

    load --table Dictionary
    [
    {"_key": "Apple"},
    {"_key": "black"},
    {"_key": "COLOR"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 3]
    select Dictionary
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         3
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         1,
    #         "apple"
    #       ],
    #       [
    #         2,
    #         "black"
    #       ],
    #       [
    #         3,
    #         "color"
    #       ]
    #     ]
    #   ]
    # ]

`NormalizerAuto` ノーマライザーはテキストを小文字に正規化します。例えば、 `"Apple"` は `"apple"` に正規化され、 `"black"` は `"blank"` に正規化され、 `"COLOR"` は `"color"` に正規化されます。

テーブルが全文検索用の語彙表の場合、トークナイズされたトークンは正規化されます。なぜなら、トークンはテーブルのキーとして保存されるからです。テーブルのキーは前述のように正規化されます。

## 7.7.2. 組み込みノーマライザー

以下は組み込みのノーマライザーのリストです。

> - `NormalizerAuto`
> - `NormalizerNFKC51`

### 7.7.2.1. `NormalizerAuto`

通常は `NormalizerAuto` ノーマライザーを使うべきです。 `NormalizerAuto` はGroonga 2.0.9以前で使っていたノーマライザーと同じものです。2.0.9以前のGroongaの `table_create` の `KEY_NORMALIZE` フラグは、2.1.0以降のGroongaの `table_create` の `--normalizer NormalizerAuto` と同じです。

`NormalizerAuto` はすべてのエンコーディングに対応しています。UTF-8でエンコードされたテキストにはUnicodeのNFKC（Normalization Form Compatibility Composition）を使います。他のエンコーディング用にはエンコーディング毎に独自の正規化をします。これらの独自の正規化の結果はNFKCでの結果と似たものになります。

例えば、半角カタカナ（例えば「ｶ」: U+FF76 HALFWIDTH KATAKANA LETTER KA） + 半角カタカナの濁点（「ﾞ」: U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK）は濁点付きの全角カタカナ（「ガ」: U+30AC KATAKANA LETTER GA）に正規化されます。前者は2文字ですが、後者は1文字です。

以下は `NormalizerAuto` ノーマライザーを使う例です。

実行例:

    table_create NormalLexicon TABLE_HASH_KEY ShortText --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]

### 7.7.2.2. `NormalizerNFKC51`

`NormalizerNFKC51` はUnicode 5.1用のUnicode NFKC（Normalization Form Compatibility Composition）を使ってテキストを正規化します。UTF-8エンコーディングのみをサポートしています。

通常、 `NormalizerNFKC51` を明示的に使う必要はありません。代わりに `NormalizerAuto` を使ってください。

以下は `NormalizerNFKC51` ノーマライザーを使う例です。

実行例:

    table_create NFKC51Lexicon TABLE_HASH_KEY ShortText --normalizer NormalizerNFKC51
    # [[0, 1337566253.89858, 0.000355720520019531], true]

## 7.7.3. 追加のノーマライザー

`groonga-normalizer-mysql` パッケージで提供される追加のノーマライザーのリストです。

> - `NormalizerMySQLGeneralCI`
> - `NormalizerMySQLUnicodeCI`
> - `NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark`

`groonga-normalizer-mysql` はGroongaのプラグインです。MySQL互換のノーマライザーを提供します。ノーマライザー `NormalizerMySQLGeneralCI` に対応するのは `utf8mb4_general_ci` です。

事前に `normalizers/mysql` プラグインを登録する必要があります。

実行例:

    register normalizers/mysql
    # [[0, 1337566253.89858, 0.000355720520019531], true]

以下は `NormalizerMySQLGeneralCI` ノーマライザーを使う例です。

実行例:

    table_create MySQLGeneralLexicon TABLE_HASH_KEY ShortText --normalizer NormalizerMySQLGeneralCI
    # [[0, 1337566253.89858, 0.000355720520019531], true]

## 7.7.4. 参考

- table_create