Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

mroongaでparserとnormalizerを同時に指定する方法

mroonga-3.03より、インデックスのコメントにて、
parserとnormalizerを指定できるようになりました。

それぞれのスキーマ(テーブル構造)設計のサンプルを交えて紹介します。
その後に、mroongaで使えるparserとnormalizerの一覧を紹介します。

parserの指定例

約20種類から選ぶことが出来ます。リストは後述。
以下の例はTokenMecabというパーサを指定する際のスキーマです。

CREATE TABLE test (
  id int NOT NULL AUTO_INCREMENT,
  content varchar(255) NOT NULL,
  PRIMARY KEY (id),
  FULLTEXT INDEX (content) COMMENT 'parser "TokenMecab"'
) ENGINE=mroonga DEFAULT CHARSET=utf8;

normalizerの指定例

3種類から選ぶことが出来ます。リストは後述。
以下の例はNormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMarkというノーマライザーを指定する際のスキーマです。

CREATE TABLE test (
  id int(11) NOT NULL AUTO_INCREMENT,
  content varchar(255) NOT NULL,
  PRIMARY KEY (id),
  FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"'
) ENGINE=mroonga DEFAULT CHARSET=utf8;

parserとnormalizerを2つ同時指定する方法

以下、TokenMecabNormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMarkを同時指定するスキーマです。
ポイントはparserとnormalizerをスペース区切りではなく、各設定を「,」で区切るということです。
具体的にはparser "Token◎◎", normalizer "Normalizer◎◎"という組み合わせです。

CREATE TABLE test (
  id int(11) NOT NULL AUTO_INCREMENT,
  content varchar(255) NOT NULL,
  PRIMARY KEY (id),
  FULLTEXT INDEX (content) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"'
) ENGINE=mroonga DEFAULT CHARSET=utf8;

応用編

mroongaのInnoDB Wrapper Modeを使いつつ、インデックスごとにparserやnormalizerを分けるとこうなります。

CREATE TABLE test (
  id int(11) NOT NULL AUTO_INCREMENT,
  content varchar(255) NOT NULL,
  content2 varchar(255) NOT NULL,
  PRIMARY KEY (id),
  FULLTEXT INDEX (content) COMMENT 'parser "TokenBigram", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"',
  FULLTEXT INDEX (content2) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"'
) ENGINE=mroonga DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';

mysql-mroonga-3.03 で使える parser

こだわり無ければTokenMecabにしておくと、インデックスサイズがコンパクトに収まります。

  • off
    トークナイズしません。"off"はcontentをそのまま扱いたい場合に使います。例えば、この値は前方一致検索のために指定します。

  • TokenBigram ※ デフォルト
    バイグラムでトークナイズする。ただし、連続したアルファベット・連続した数字・連続した記号はそれぞれ1つのトークンとして扱う。そのため、3文字以上のトークンも存在する。これはノイズを減らすためである。

  • TokenMecab
    MeCabを用いてトークナイズする。groongaがMeCabサポート付きでビルドされている必要がある。

  • TokenBigramSplitSymbol
    バイグラムでトークナイズする。TokenBigramと異なり、記号が連続していても特別扱いして1つのトークンとして扱わず通常のバイグラムの処理を行う。
    TokenBigramではなくTokenBigramSplitSymbolを利用すると「Is it really!?!?!?」の「!?!?!?」の部分に「!?」でマッチする。TokenBigramの場合は「!?!?!?」でないとマッチしない。

  • TokenBigramSplitSymbolAlpha
    バイグラムでトークナイズする。TokenBigramSplitSymbolに加えて、連続したアルファベットも特別扱いせずに通常のバイグラムの処理を行う。
    TokenBigramではなくTokenBigramSplitSymbolAlphaを利用すると「Is it really?」に「real」でマッチする。TokenBigramの場合は「really」でないとマッチしない。

  • TokenBigramSplitSymbolAlphaDigit
    バイグラムでトークナイズする。TokenBigramSplitSymbolAlphaに加えて、連続した数字も特別扱いせずに通常のバイグラムの処理を行う。つまり、すべての字種を特別扱いせずにバイグラムの処理を行う。
    TokenBigramではなくTokenBigramSplitSymbolAlphaDigitを利用すると「090-0123-4567」に「567」でマッチする。TokenBigramの場合は「4567」でないとマッチしない。

  • TokenBigramIgnoreBlank
    バイグラムでトークナイズする。TokenBigramと異なり、空白を無視して処理する。
    TokenBigramではなくTokenBigramIgnoreBlankを利用すると「み な さ ん 注 目」に「みなさん」でマッチする。TokenBigramの場合は「み な さ ん」でないとマッチしない。

  • TokenBigramIgnoreBlankSplitSymbol
    バイグラムでトークナイズする。TokenBigramSplitSymbolと異なり、空白を無視して処理する。
    TokenBigramSplitSymbolではなくTokenBigramIgnoreBlankSplitSymbolを利用すると「! !? ??」に「???」でマッチする。TokenBigramSplitSymbolの場合は「? ??」でないとマッチしない。

  • TokenBigramIgnoreBlankSplitSymbolAlpha
    バイグラムでトークナイズする。TokenBigramSplitSymbolAlphaと異なり、空白を無視して処理する。
    TokenBigramSplitSymbolAlphaではなくTokenBigramIgnoreBlankSplitSymbolAlphaを利用すると「I am a pen.」に「ama」でマッチする。TokenBigramSplitSymbolAlphaの場合は「am a」でないとマッチしない。

  • TokenBigramIgnoreBlankSplitSymbolAlphaDigit
    バイグラムでトークナイズする。TokenBigramSplitSymbolAlphaDigitと異なり、空白を無視して処理する。
    TokenBigramSplitSymbolAlphaDigitではなくTokenBigramIgnoreBlankSplitSymbolAlphaDigitを利用すると「090 0123 4567」に「9001」でマッチする。TokenBigramSplitSymbolAlphaDigitの場合は「90 01」でないとマッチしない。

  • TokenDelimit
    空白区切りでトークナイズする。
    "movie horror topic" will be tokenised as "movie", "horror", "topic".

  • TokenDelimitNull
    null文字(\0)区切りでトークナイズする。
    "movie\0horror\0topic" will be tokenised as "movie", "horror", "topic".

  • TokenUnigram
    ユニグラムでトークナイズする。ただし、連続したアルファベット・連続した数字・連続した記号はそれぞれ1つのトークンとして扱う。そのため、2文字以上のトークンも存在する。これはノイズを減らすためである。

  • TokenTrigram
    トリグラムでトークナイズする。ただし、連続したアルファベット・連続した数字・連続した記号はそれぞれ1つのトークンとして扱う。そのため、4文字以上のトークンも存在する。これはノイズを減らすためである。

mysql-mroonga-3.03 で使える normalizer

オススメはNormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMarkです。

  • NormalizerMySQLGeneralCI
    MySQLでいうutf8mb4_general_ciを模したノーマライザー

  • NormalizerMySQLUnicodeCI
    MySQLでいうutf8mb4_unicode_ciを模したノーマライザー

  • NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark
    濁音・半濁音・「ぁ」「ぃ」「ぅ」「ぇ」「ぉ」「っ」などは区別しつつ、カタカナとひらがなは同一視することができるノーマライザーです。「ブラック」と「ふらつく」、「バルス」と「パルス」を区別できます。

参考記事