[groonga-dev,01188] Re: mroongaストレージモードでのユニークインデックス使用時の挙動について

アーカイブの一覧に戻る

Kouhei Sutou kou****@clear*****
2013年 2月 5日 (火) 16:30:44 JST


須藤です。

In <77580****@web10*****>
  "[groonga-dev,01187] mroongaストレージモードでのユニークインデックス使用時の挙動について" on Mon, 4 Feb 2013 19:52:16 +0900 (JST),
  <mail_babir****@yahoo*****> wrote:

> mroongaを利用していたところ、気になる挙動がありましたので、ご連絡させて頂きました。

ありがとうございます!

> 具体的には、mroongaストレージモードにてユニークインデックスを貼ったカラムに大文字英字を登録すると、小文字英字の検索でしかヒットしなくなるというものです。
> 
> 以下再現手順となります。

ありがとうございます。手元でも再現しました。

調べたところ、groonga側に問題があることがわかったので修正し
ました。2/9リリース予定のバージョンで修正される予定です。

> ただ、更新性能を考えるとストレージモードで利用したいところですので、何か改善策がありましたら、ご教示頂けますと幸いです。

2/9まではすべて小文字を指定するとだいたいのケースでうまく動
くと思います。(丸囲みのキロメートルとか、半角カタカナとかは
動きません。)

あるいは、以下のようにCOLLATIONとしてutf8_binを明示的に指定す
ると大文字小文字を区別せずにそのものでヒットするようになりま
す。

  CREATE TABLE `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `main` varchar(255) COLLATE utf8_bin NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `main` (`main`)
  ) ENGINE=mroonga DEFAULT CHARSET=utf8;

なので、

  SELECT * FROM `test` WHERE `main` = 'BLACK';

でヒットするようになります。が、

  SELECT * FROM `test` WHERE `main` = 'black';

や、

  SELECT * FROM `test` WHERE `main` = 'bLaCk';

などはヒットしません。

もし、文字の正規化が必要ないならこれでよいと思います。


あるいは、2/9に新しいバージョンがリリースされたら、それにバー
ジョンアップすることで大文字小文字関係なくちゃんとヒットする
ようになります。ただ、2/9のリリースはCOLLATION周りで大きな変
更が入るので、バージョンアップ前にちゃんと検証する必要がある
ので注意してください。

現在はgroongaと同じ正規化をしますが、2/9リリースバージョンは
MySQLと同じ正規化をします。utf8_general_ciと
utf8mb4_general_ciのみサポート予定です。正規化方法が変わると
インデックスを作りなおす必要があるので、インデックスを再作成
する必要があります。また、テーブルのキーでCOLLATEを指定して
いる場合はそのテーブルも作りなおす必要があります。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る