隔週連載groonga

第10回 [実録] MySQL向け全文検索エンジン「Tritonn」から「mroonga」への移行ガイド(3)

この記事を読むのに必要な時間:およそ 9 分

Tritonnからmroongaへのテーブルスキーマ書き換えガイド

mroongaのインストールが完了したので,mroongaストレージエンジンを用いてフルテキストインデックスを作成します。それでは,Tritonnで動かしていたときとほぼ互換となるmroongaスキーマの紹介を行います。

NGRAMインデックスを作成する場合

Tritonnで言うNGRAMはいわゆるbigramで,mroongaでのBigramとイコールです。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX USING NGRAM `fulltext` (text)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenBigram"'
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenBigram"'
) ENGINE = mroonga DEFAULT CHARSET utf8 COMMENT='engine "MyISAM"';

TritonnでUSING句を省略するとNGRAMが適用されていたように,mroongaでもBigramがデフォルトです。そのため,FULLTEXT INDEXの後ろで指定していたCOMMENTでのparser指定を次のように省略しても構いません。

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text)
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text)
) ENGINE = mroonga DEFAULT CHARSET utf8 COMMENT='engine "MyISAM"';

そして,N-gramは文書をN文字ずつに切り出した見出し語を元に,転置インデックスを作成する方法です。詳細は次の記事が参考になります。

また,mroongaではTokenBigram以外にも様々なN-gramに対応しておりますので,気になる方は次の記事を参照しましょう。

単語(MeCab)インデックスを作成する場合

形態素解析エンジンであるMeCabも,Tritonn同様に使えます。TritonnではMeCabで使える辞書はipadicのみでしたが,mroongaではipadicの他にjumandicも利用できます。先ほどのyum installコマンドのmecab-ipadicの代わりにmecab-jumandicを指定するだけで使えるようになります。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX USING MECAB (text)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenMecab"'
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenMecab"'
) ENGINE = mroonga DEFAULT CHARSET=utf8 COMMENT='engine "MyISAM"';
DELIMITEDインデックスを作成する場合

空白で区切られた文字列単位でインデックスを作成します。これはスペース区切りで単語を入れて利用する,いわゆるタグ検索に便利です。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX USING DELIMITED (text)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenDelimit"'
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenDelimit"'
) ENGINE = mroonga DEFAULT CHARSET utf8 COMMENT='engine "MyISAM"';
MySQLの素のfulltext indexを作成する(sennaインデックスを使用しない)場合

mroongaはTritonnのようなMyISAMに手を入れることは行っていないため,素直にテーブルを作るだけで事は足ります。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX USING NO SENNA (text)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroonga時代の定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  FULLTEXT INDEX (text)
) ENGINE = MyISAM DEFAULT CHARSET utf8;
マルチセクション機能の使用/不使用(tritonn-1.0.4より対応)

mroongaではスキーマで定義せずとも,マルチセクション機能(Wプラグマ)が使えます。複合FULLTEXTインデックスを作れば,その中から任意のフィールドで検索できます。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  text2 TEXT NOT NULL,
  FULLTEXT INDEX USING MECAB, SECTIONALIZE (text, text2)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  text2 TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text, text2) COMMENT 'parser "TokenMecab"'
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  text2 TEXT NOT NULL,
  FULLTEXT INDEX `fulltext` (text, text2) COMMENT 'parser "TokenMecab"'
) ENGINE = mroonga DEFAULT CHARSET utf8 COMMENT='engine "MyISAM"';
正規化機能の使用/不使用

TritonnではNO NORMALIZEとすることで,正規化を行わない指定ができました。例では正規化なしでNGRAMトークナイズを行います。カラム単位での例を挙げますが,テーブル単位でCOLLATE=utf8_binとしても良いでしょう。

-- Tritonnでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT NOT NULL,
  text2 TEXT NOT NULL,
  FULLTEXT INDEX USING NGRAM, NO NORMALIZE (text, text2)
) ENGINE = MyISAM DEFAULT CHARSET utf8;

-- mroongaストレージモードでの定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT utf8_bin NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenBigram"'
) ENGINE = mroonga DEFAULT CHARSET utf8;

-- mroongaラッパーモード(MyISAM)での定義
CREATE TABLE test (
  id INTEGER AUTO_INCREMENT,
  PRIMARY KEY (id),
  text TEXT utf8_bin NOT NULL,
  FULLTEXT INDEX `fulltext` (text) COMMENT 'parser "TokenBigram"'
) ENGINE = mroonga DEFAULT CHARSET utf8 COMMENT='engine "MyISAM"';

以上,Tritonnとmroongaのスキーマ書き換えガイドでした。

mroongaはTokenMecab, TokenNgramだけでなく合計約20種類のトークナイザを利用できます。詳細は次の記事が参考になります。

著者プロフィール

吉田健太郎(Kentaro Yoshida)

株式会社リブセンス,Web系インフラの研究開発エンジニア。

ITベンチャー立ち上げに参画し,幅広い領域での経験を積むこと8年目。フルスタックエンジニアを目指して,湧き出るアイディアを形にする日々を過ごしている。

GitHub:https://github.com/y-ken/
ブログ:http://y-ken.hatenablog.com/