# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.9. トークンフィルター

## 7.9.1. 概要

Groongaにはトークナイズされたトークンに所定の処理を行うトークンフィルターモジュールがあります。

トークンフィルターモジュールはプラグインとして追加できます。

トークンフィルタープラグインをGroongaに追加することでトークナイズされたトークンをカスタマイズできます。

テーブルは0個以上のトークンフィルターを持てます。テーブルにトークンフィルターを付けるには table_create の token_filters オプションを使います。

以下は `TokenFilterStopWord` トークンフィルターモジュールを使う `table_create` の例です。

実行例:

    plugin_register token_filters/stop_word
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto \
      --token_filters TokenFilterStopWord
    # [[0, 1337566253.89858, 0.000355720520019531], true]

## 7.9.2. 利用可能なトークンフィルター

以下は組み込みのトークンフィルターのリストです。

- `TokenFilterStopWord`
- `TokenFilterStem`

### 7.9.2.1. `TokenFilterStopWord`

`TokenFilterStopWord` は、文書を検索する時にトークナイズされたトークンからストップワードを除去します。

`TokenFilterStopWord` は、文書を検索する時のみトークン除去するため、文書を追加した後でストップワードを指定することもできます。

ストップワードは、語彙表の `is_stop_word` カラムで指定します。

以下は `TokenFilterStopWord` トークンフィルターを使う例です。

実行例:

    plugin_register token_filters/stop_word
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Memos TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Memos content COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto \
      --token_filters TokenFilterStopWord
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms is_stop_word COLUMN_SCALAR Bool
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Terms
    [
    {"_key": "and", "is_stop_word": true}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 1]
    load --table Memos
    [
    {"content": "Hello"},
    {"content": "Hello and Good-bye"},
    {"content": "Good-bye"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 3]
    select Memos --match_columns content --query "Hello and"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         1,
    #         "Hello"
    #       ],
    #       [
    #         2,
    #         "Hello and Good-bye"
    #       ]
    #     ]
    #   ]
    # ]

`and` というトークンは `Terms` テーブルでストップワードと指定されています。

`"Hello"` は文書内に `and` がありませんがマッチしています。なぜなら、 `and` はストップワードと指定されているため、クエリーから除去されているからです。

### 7.9.2.2. `TokenFilterStem`

`TokenFilterStem` は、トークナイズされたトークンをステミングします。

以下は `TokenFilterStem` トークンフィルターを使う例です。

実行例:

    plugin_register token_filters/stem
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Memos TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Memos content COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto \
      --token_filters TokenFilterStem
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Memos
    [
    {"content": "I develop Groonga"},
    {"content": "I'm developing Groonga"},
    {"content": "I developed Groonga"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 3]
    select Memos --match_columns content --query "develops"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         3
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         1,
    #         "I develop Groonga"
    #       ],
    #       [
    #         2,
    #         "I'm developing Groonga"
    #       ],
    #       [
    #         3,
    #         "I developed Groonga"
    #       ]
    #     ]
    #   ]
    # ]

`develop` も `developing` も `developed` も `develops` も、すべてステミングすると `develop` になります。そのため、 `develops` というクエリーで `develop` も `developing` も `developed` も検索できます。

## 7.9.3. 参考

- table_create