Category Archives: InnoDB

The InnoDB Change Buffer

One of the challenges in storage engine design is random I/O during a write operation. In InnoDB, a table will have one clustered index and zero or more secondary indexes.  Each of these indexes is a B-tree.  When a record is inserted into a table, the record is first inserted into clustered index and then into each of the secondary indexes. …

InnoDB 全文検索 : MeCab Parser

(この記事は InnoDB Full-Text: MeCab ParserYoshiaki Yamasaki が翻訳したものです)

このブログ記事で紹介した一般的なCJK(中国語、日本語、韓国語)のサポートに加えて、私達はMeCabパーサーも追加しました。MeCabは日本語の形態素解析エンジンで、私達は今MeCabをベースにした全文検索プラグインパーサーを持っています!

使用方法

  1. mecab_rc_fileオプションを設定する — mecab_rc_fileはMeCabパーサーに関連する読み取り専用のシステム変数です。mecab_rc_fileが指すmecabrcファイルはMeCabが必要とする設定ファイルです。そして、MeCabに辞書をどこからロードすればいいかを伝えるために、 dicdir=/path/to/ipadicというエントリが必要です。MySQLがインストールされると、デフォルトでバンドルされているmecabrcファイルは /path/to/mysql/install/lib/mecab/etc/mecabrcにあります。また、ipadic_euc-jp, ipadic_sjis, ipadic_utf-8という3つの辞書が /path/to/mysql/install/lib/mecab/dicディレクトリにあります。私たちはこれら3つの内から使用したい辞書を1つ指定するために、mecabrcファイルを修正する必要があります。
    注意:あなたが独自の辞書を持っている場合は、代わりにその辞書を使用できます。mecabrcファイル内で指定できる多くの追加オプションも有ります。設定ファイルの詳細に関しては、こちらのマニュアルを参照して下さい。ここではテスト目的で、以下の手順でipadic_utf-8をロードしてみましょう。(以下の例では、MySQL 5.7.7は/usr/local/mysqlにインストールされています) :
    1. この様なエントリをmecabrcファイルに追加します:
      dicdir=/usr/local/mysql/lib/mecab/dic/ipadic_utf-8
    2. この様なエントリを/etc/my.cnfファイルの[mysqld]セクションに追加します:
      loose-mecab-rc-file=/usr/local/mysql/lib/mecab/etc/mecabrc
  2. innodb_ft_min_token_sizeを設定します— MeCabパーサーを使う場合の推奨値は1もしくは2です(デフォルト値は3です)。以下の例では1を使用します。
  3. MeCabプラグインをインストール:
  4. MeCabパーサーを使って全文検索インデックスを作成
    (注意:MySQL 5.7.6では、utf8mb4の代わりにut8を指定する必要があります。
    The MeCab parser plugin now supports the eucjpms, cp932, and utf8mb4 character sets in 5.7.7 and later—Bug#20534096):

MeCabトークン化の詳細

トークン化がどのように行われるのかを明確に示す例を見てみましょう:

MeCabを使った全文検索の詳細
テキスト検索

  • NATURAL LANGUAGE MODEでは、検索されるテキストは検索トークンの和集合に変換されます。例えば、’日本の首都’は’日本 の 首都’に変換されます。ここで具体例を紹介します:
  • BOOLEAN MODEでは、検索されるテキストはフレーズ検索に変換されます。例えば、’日本の首都’は'”日本 の 首都”‘に変換されます。ここで具体例を紹介します:

ワイルドカードを使った検索

  • ワイルドカードを使った検索はトークナイズされません。例えば、’日本の首都*’は接頭辞’日本の首都’を検索します。そして、一致する結果が得られないかもしれません。ここで2つの具体例を紹介します:

フレーズ検索

  • フレーズ検索はMeCabによってトークナイズされます。例えば、”日本の首都”は”日本 の 首都”に変換されます。ここで具体例を紹介します:

MeCabの制限

サポートしているキャラクタセットはeucjpms (ujis), cp932 (sjis), utf8 (utf8mb4)の3つです。MeCabが使用しているキャラクタセットとInnoDBが使用しているキャラクタセットに違いがある場合(例えばMeCabのキャラクタセットがujisで、全文検索インデックスがutf8/utf8mb4の場合)、検索しようとした時にキャラクタセット不一致のエラーが発生します。

InnoDBの全文検索全般に関して詳細を知りたい場合は、ユーザーマニュアルのInnoDB Full-Text Index セクションや、ジミーの素晴らしい記事(Dr.