groongaでMySQL互換のノーマライザーを使うには

> もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroongaのトピックを投稿予定です。

groongaやmroongaを実際に使っていて、記事を書いてもいいよ、という人を募集しています。
すでに数名の方からご応募いただいていますが、まだまだ募集中です。
詳細は[groonga普及のための協力のお願い](http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-February/001186.html)を参照してください。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。
最新のバージョンは2013年2月28日にリリースした3.0.1です。

以前[mroongaでMySQL互換の照合順序を使うには](http://qiita.com/items/41d12f16b091426d2158)という記事を書きました。

これは、mroongaでMySQL互換の照合順序として ```utf8_general_ci``` と ```utf8mb4_general_ci``` のサポートを追加したので、その使い方を紹介するものでした。

以前紹介したときにはMySQL互換の照合順序は上記2つだけでした。
その後MySQL互換の照合順序の機能追加が入ったので、今回はそちらを含め、groongaでMySQL互換の照合順序を使う方法について紹介します。

# MySQL互換の照合順序(ノーマライザー)

groongaでは、以下のMySQL互換の照合順序(ノーマライザー)をサポートしています。

* NormalizerMySQLGeneralCI
* NormalizerMySQLUnicodeCI

それぞれ、MySQLでいうところの```utf8mb4_general_ci```や```utf8mb4_unicode_ci```に相当します。

これらを利用するには別パッケージとなっている ```groonga-noramlizer-mysql``` パッケージをインストールする必要があります。

# パッケージのインスール

groongaの[インストール](http://groonga.org/ja/docs/install.html)が終わっているなら、以下の手順で```groonga-noramlizer-mysql``` を簡単にインストールすることができます。

## Debian/Ubuntu

```
  % sudo apt-get -y install groonga-normalizer-mysql
```

## CentOS/Fedora

```
  % sudo yum install -y groonga-normalizer-mysql
```

# プラグインの登録

groongaではMySQL互換の照合順序(ノーマライザー)をプラグインとして提供しているので、パッケージのインストール後にプラグインを以下のようにして登録します。


```
% groonga
> register normalizers/mysql
[[0,1363840334.70764,0.000237226486206055],true]
```

# ノーマライザーの指定

プラグインの登録ができたので、実際にMySQL互換の照合順序を試してみます。

以下はサンプルとして使うテーブルのスキーマです。

```
table_create Words TABLE_PAT_KEY ShortText
column_create Words description COLUMN_SCALAR ShortText

table_create Lexicon TABLE_PAT_KEY ShortText --normalizer NormalizerMySQLUnicodeCI
column_create --table Lexicon --name word_index --flags COLUMN_INDEX|WITH_POSITION --type Words --source _key
```

Wordsというテーブルとその語彙表としてLexiconテーブルを作成します。
ノーマライザーは語彙表に```NormalizerMySQLUnicodeCI```を指定します。

このテーブルに、loadコマンドでデータを登録します。

```
load --table Words
[
{"_key":"A", "description":"半角大文字A"},
{"_key":"a", "description":"半角小文字a"},
{"_key":"Á", "description":"LATIN LARGE LETTER A WITH ACUTE"},
{"_key":"á", "description":"LATIN SMALL LETTER A WITH ACUTE"},
{"_key":"À", "description":"LATIN LARGE LETTER A WITH GRAVE"},
{"_key":"à", "description":"LATIN SMALL LETTER A WITH GRAVE"},
{"_key":"Ａ", "description":"全角大文字A"},
{"_key":"ａ", "description":"全角小文字a"}
]
```

正しく登録できたかを、次のselectコマンドで確認します。

```
select --table Words
```

上のコマンドを実行した結果を見やすいように抜粋し、整形すると以下のようになります。
（なお、以降の実行結果も適宜抜粋・整形しており、実際の実行結果には他にも情報が出力されます。詳しくは[出力内容についてのドキュメント](http://groonga.org/ja/docs/reference/command/output_format.html)をご覧ください。）

```
[
  [
    [8],
    [
      ["_id","UInt32"],["_key","ShortText"],["description","ShortText"]
    ],
    [1,"A","半角大文字A"],
    [2,"a","半角小文字a"],
    [5,"À","LATIN LARGE LETTER A WITH GRAVE"],
    [3,"Á","LATIN LARGE LETTER A WITH ACUTE"],
    [6,"à","LATIN SMALL LETTER A WITH GRAVE"],
    [4,"á","LATIN SMALL LETTER A WITH ACUTE"],
    [7,"Ａ","全角大文字A"],
    [8,"ａ","全角小文字a"]
  ]
]
```

データが8件すべて登録できていることがわかります。

それでは、MySQL互換のノーマライザーが使えているか確認してみます。

```
select --table Words --query _key:@a
```

結果は以下のようになります。

```
[
  [
    [6],
  [
    ["_id","UInt32"],["_key","ShortText"],["description","ShortText"]
  ],
  [1,"A","半角大文字A"],
  [2,"a","半角小文字a"],
  [3,"Á","LATIN LARGE LETTER A WITH ACUTE"],
  [4,"á","LATIN SMALL LETTER A WITH ACUTE"],
  [5,"À","LATIN LARGE LETTER A WITH GRAVE"],
  [6,"à","LATIN SMALL LETTER A WITH GRAVE"]
  ]
]
```

実行結果を見ると、半角大文字Aと小文字のaだけでなく、"LATIN LARGE LETTER A WITH ACUTE"や"LATIN SMARLL LETTER A WITH ACUTE"、
"LATIN LARGE LETTER A WITH GRAVE"、"LATIN SMALL LETTER A WITH GRAVE"が同一視されていることがわかります。

ノーマライザーの返す結果だけを確かめたい場合には、```normalize```コマンドを使うこともできます。
```normalize```コマンドの最初の引数にノーマライザーを指定します。
その次の引数にノーマライズ対象となる文字列を指定します。

```
normalize NormalizerMySQLUnicodeCI "Á LATIN LARGE LETTER WITH ACUTE"
normalize NormalizerMySQLUnicodeCI "á LATIN SMALL LETTER WITH ACUTE"
normalize NormalizerMySQLUnicodeCI "À LATIN LARGE LETTER WITH GRAVE" 
normalize NormalizerMySQLUnicodeCI "à LATIN SMALL LETTER WITH GRAVE"
```

正しくノーマライザーを適用できた場合には、次のような結果が返ってきます。

```
[[0,1363845602.35331,1.12056732177734e-05],{"normalized":"A LATIN LARGE LETTER WITH ACUTE","types":[]}]
[[0,1363845602.35333,1.07288360595703e-05],{"normalized":"A LATIN SMALL LETTER WITH ACUTE","types":[]}]
[[0,1363845602.35335,1.26361846923828e-05],{"normalized":"A LATIN LARGE LETTER WITH GRAVE","types":[]}]
[[0,1363845602.35337,1.07288360595703e-05],{"normalized":"A LATIN SMALL LETTER WITH GRAVE","types":[]}]
```

実行結果の```normalized```がノーマライザーを適用した結果の文字列です。

# まとめ

今回はgroongaでMySQL互換の照合順序(ノーマライザー)を使う方法を紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。