ElasticsearchのAnalyzer, Tokenizer, Token Filters, Char Filtersの一覧

memo: 2.3のドキュメントを参照して書いてます

# Analyzers

Analyzerは1つのTokenizerと0個以上のToken Filters、0個以上のCharacter Filtersで構成される。イメージは以下。

```
input => Character Filters => Tokenizer => Token Filters => output
```

Analyzerは以下の種類がある。それぞれの構成要素も入れた

* Standard Analyzer
    * Character Filters: なし
    * Tokenizer: Standard Tokenizer
    * Token Filters:
        * Standard Token Filter
        * Lowercase Token Filter
        * Stop Token Filter
* Simple Analyzer
    * Character Filters: なし
    * Tokenizer: Lowercase Tokenizer
    * Token Filters: なし
* Whitespace Analyzer
    * Character Filters: なし
    * Tokenizer: Whitespace Tokenizer
    * Token Filters: なし
* Stop Analyzer
    * Character Filters: 
    * Tokenizer: Lowercase Tokenizer
    * Token Filters: Stop Token Filter
* Keyword Analyzer
    * Character Filters: なし
    * Tokenizer: Keyword Tokenizer
    * Token Filters: なし
* Pattern Analyzer
    * Character Filters: 
    * Tokenizer: Pattern Tokenizer
    * Token Filters: 設定で使うかどうか変えれる
        * Lowercase Token Filter
        * Stop Token Filter
* Language Analyzers: 各言語に特化したAnalyzer. ドキュメントを見ればどのようにカスタムAnalyzerで置き換えれるか書いてある
* Snowball Analyzer
    * Character Filters: 
    * Tokenizer: Standard Tokenizer
    * Token Filters:
        * Standard Token Filter
        * Lowercase Token Filter
        * Stop Token Filter
        * Snowball Token Filter
* Custom Analyzer: 自分でChar Filter, Tokenizer, Token Filtersを定義する


# Tokenizers

以下の種類がある

* Standard Tokenizer: 文法に基づいたトークン化を行う。ほとんどのヨーロッパ言語に適用している。
* Edge NGram Tokenizer: 基本はNグラムと同じだが、文の始まりトークンの最初の文字列からはじまるものだけをトークン化する
* Keyword Tokenizer: 文字列全体をトークンとして扱う
* Letter Tokenizer: 文字列でないもので区切ったものをトークンとして扱う
* Lowercase Tokenizer: Letter TokenizerとLower Case Token Filterを一緒に使ったときと同じ効果がある。2つを別々で使うより一緒にするほうがパフォーマンスがいい。
* NGram Tokenizer: Nグラムのトークナイザー。
* Whitespace Tokenizer: スペースで分ける
* Pattern Tokenizer: 正規表現でトークン化を行う
* UAX Email URL Tokenizer: Standard Tokenizerと同じように振る舞うが、emailとURLは１つのトークンとして扱う
* Path Hierarchy Tokenizer: パスを階層でわけてそれをトークンとして扱う。例えば```/something/something/else```というパスは```/something```, ```/something/something```, ```/something/something/else```という3つのトークンとして扱われる。
* Classic Tokenizer: 省略
* Thai Tokenizer: 省略

# Token Filters

以下の種類がある

* Standard Token Filter: Standard Tokenizerで抽出されたトークンを正規化する。ただ、現状のバージョンでは何もしていない
* ASCII Folding Token Filter: ASCII文字でないものをASCII文字に置き換える。Pokémon GOはPokemon GOになる。
* Length Token Filter: 長過ぎたり、短すぎたりする文字列を削除する
* Lowercase Token Filter: 小文字に正規化する
* Uppercase Token Filter: 大文字に正規化する
* NGram Token Filter: Nグラムで正規化する。デフォルトでは最小1, 最大2でトークンをフィルタする。
* Edge NGram Token Filter: Nグラムで正規化するが、トークンの最初のものだけにNグラムを適用する。
* Porter Stem Token Filter: ポーターのステムアルゴリズムによりトークンをステム化する。
* Shingle Token Filter: トークン化されたものをつなぎあわせたものもトークンとして扱う。```This is a pen```なら、`This`, `This is`... というふうに隣り合ったものがトークンとして扱われる。
* Stop Token Filter: ストップワードをフィルタする。
* Word Delimiter Token Filter: ハイフンなどがついているワードを分ける。分けるのに使用する文字は指定できる。
* Stemmer Token Filter: ステム化するフィルタ。各言語のものが使える。
* Stemmer Override Token Filter: カスタムした文字列でステム化できる
* Keyword Marker Token Filter: 特定のキーワードがステム化されるのを防ぐ
* Keyword Repeat Token Filter: 省略
* KStem Token Filter: 英語でパフォーマンスのたかいステム化フィルタ
* Snowball Token Filter: ステムワード(語幹: 語幹が変化するまえの基本形の形)を使ってフィルタする。各言語対応している(日本語はない). 
* Phonetic Token Filter: 発音上の分け方でわける。プラグインでのインストールが必要。
* Synonym Token Filter: シノニムを扱いやすくするためのフィルタ. SolrとWordNetフォーマットでシノニムを使用できる。
* Compound Word Token Filter: 省略
* Reverse Token Filter: トークン化された文字列を逆にして出力する.```pen```は```nep```と出力される。
* Elision Token Filter: Elison(フランス語などで使用される冠詞)を削除する
* Truncate Token Filter: 指定の文字列でトークンをフィルタする
* Unique Token Filter: 省略
* Pattern Capture Token Filter: 省略
* Pattern Replace Token Filter: 正規表現で置き換えるフィルタ
* Trim Token Filter: トークンのまわりのスペースを削除する
* Limit Token Count Token Filter: １つのドキュメントに対してトークンの数を制限する
* Hunspell Token Filter: Hunspellのステム化を使ってフィルタする。
* Common Grams Token Filter: 省略
* Normalization Token Filter: 省略
* CJK Width Token Filter: CJKとはChinese, Japanese, Koreanのこと。全角英数字を半角へ、半角カナを全角カナへフィルタする。
* CJK Bigram Token Filter: 省略
* Delimited Payload Token Filter: 省略
* Keep Words Token Filter: 省略
* Keep Types Token Filter: 省略
* Classic Token Filter: 省略
* Apostrophe Token Filter: Apostrophe(')で分ける
* Decimal Digit Token Filter: Unicodeの0-9を0-9へフィルタする


# Character Filters

以下の種類がある。

* Mapping Char Filter: 特定のテキストを指定のテキストに置き換える. ハッシュで、keyを置き換え前、valueを置き換え後のものして指定する
* HTML Strip Char Filter: HTMLタグを摘出する
* Pattern Replace Char Filter: 正規表現で置き換える




# 参考
* https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html