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つ同時指定する方法
以下、TokenMecab
とNormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark
を同時指定するスキーマです。
ポイントは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
オススメはNormalizerMySQLGeneralCIExceptKanaCIKanaWithVoicedSoundMark
です。
NormalizerMySQLGeneralCI
MySQLでいうutf8mb4_general_ci
を模したノーマライザーNormalizerMySQLUnicodeCI
MySQLでいうutf8mb4_unicode_ci
を模したノーマライザー(utf8_general_ci
やutf8_unicode_ci
に相当)NormalizerMySQLGeneralCIExceptKanaCIKanaWithVoicedSoundMark
濁音・半濁音・「ぁ」「ぃ」「ぅ」「ぇ」「ぉ」「っ」などは区別しつつ、カタカナとひらがなは同一視することができるノーマライザーです。「ブラック」と「ふらつく」、「バルス」と「パルス」を区別できます。
参考記事
http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-April/001340.html http://qiita.com/items/5f84689247f1f0d94e01 http://mroonga.org/ja/docs/userguide/wrapper.html https://github.com/groonga/groonga-normalizer-mysql
PlanetMySQL Voting: Vote UP / Vote DOWN