Kouhei Sutou
kou****@clear*****
2016年 3月 14日 (月) 23:33:47 JST
須藤です。 In <56E67****@webmk*****> "[groonga-dev,03978] tokenizeとtable_tokenizeとの結果の違いについて" on Mon, 14 Mar 2016 17:46:55 +0900, "info****@webmk*****" <info****@webmk*****> wrote: > 以下のコマンド(Groongaまたはmroonga_command)で、 > > tokenize TokenMecab 'Wi-Fi' > > 及び > > table_tokenize contents#content 'Wi-Fi' > > を実行すると、それぞれで結果が違ってきます。 ... > MySQLのテーブル「contents」に正しくトークナイザーが設定されていれば、本 > 来は、どちらも同じ結果になると思うのですが、この認識は合っているでしょうか? あぁ、すみません。 あっていないです。 実は、もうひとつ関係する要素があるんです。それがノーマライザー です。 > なお、Groongaコマンドの「table_list」の出力結果の一部は以下となってお > り、トークナイザーは正しく設定されているようです。 > > [2] => Array > ( > [0] => 324 > [1] => contents#content > [2] => mroonga_test.mrn.0000144 > [3] => TABLE_PAT_KEY|PERSISTENT > [4] => ShortText > [5] => > [6] => TokenMecab > [7] => NormalizerAuto > ) ↑だとNormalizerAutoとなっているやつです。 Groongaはトークナイズする前にノーマライズするんです。 NormalizerAutoは「Wi-Fi」を「wi-fi」にノーマライズします。 そのため、TokenMecabは「wi-fi」を解析します。 これは、辞書に登録されている「Wi-Fi」とは異なるので、 * wi * - * fi とトークナイズされています。 次のように全文検索用のインデックスを作るとノーマライザーを使 わなくなるので「Wi-Fi」とトークナイズされます。 FULLTEXT INDEX (column) COMMENT 'normalizer "none"' ただ、半角カタカナ→いわゆる全角カタカナのようなノーマライズ も無効になります。 トークナイズ後にノーマライズする機能が必要なのかもしれませ ん。。。(トークンフィルターで実現できるはず。) > 「tokenize TokenMecab 'Wi-Fi'」の結果も、「table_tokenize > contents#content 'Wi-Fi'」の結果も同じであることが正しい動作と考えている > のですが、もし、認識違いや設定のミス、確認しておいた方がいい点などありま > したらご教授願えませんでしょうか? 実は、「tokenize TokenMecab 'Wi-Fi' NormalizerAuto」だと同じ 結果になるんです。 ぜんぜん気をつけるポイントを洗い出せてなくてすみません。。。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ リーダブルコードワークショップ: http://www.clear-code.com/services/code-reader/readable-code-workshop.html