[groonga-dev,03979] Re: tokenizeとtable_tokenizeとの結果の違いについて

Back to archive index

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




groonga-dev メーリングリストの案内
Back to archive index