LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-03-21

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

groongaやmroongaを実際に使っていて、記事を書いてもいいよ、という人を募集しています。
すでに数名の方からご応募いただいていますが、まだまだ募集中です。
詳細はgroonga普及のための協力のお願いを参照してください。

はじめに

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

以前mroongaでMySQL互換の照合順序を使うにはという記事を書きました。

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

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

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

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

  • NormalizerMySQLGeneralCI
  • NormalizerMySQLUnicodeCI

それぞれ、MySQLでいうところのutf8mb4_general_ciutf8mb4_unicode_ciに相当します。

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

パッケージのインスール

groongaのインストールが終わっているなら、以下の手順で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":"A", "description":"全角大文字A"},
{"_key":"a", "description":"全角小文字a"}
]

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

select --table Words

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

[
  [
    [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","全角大文字A"],
    [8,"a","全角小文字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に興味を持ったなら、まずはインストールして試してみてください。

groongaの基本的な動作を知るためのチュートリアルもあります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1