今までelasticsearchの記事で当たり前のようにAnalyzerAnalyzerといってきたが、Analyzerとはそもそも一体何なのだろうか?
その答えは、
Source Textに対して…
1. Char Filterで文字列を操作する
ex) たとえば、
2. Tokenizerでトークン化
3. Token Filterでトークンごとの処理
ex) トークンのLowercase化、ストップワードの除去、複数形を単数形に直す
1~3の処理を行う部分をまとめてAnalyzerと呼んでいる。
つまり、アナライザーとは複数のコンポーネントの組み合わせなのである。
アナライザーは上記3つのChar Filter、Tokenizer、Token Filterのみっつを自分好みに組み合わせることで作ることが出来る。
しかし、自分で設定するのが面倒な人のためにelasticsearch標準のAnalyzerセットがいくつか用意されている。
どのようなときにどのアナライザーを適用すべきか考えるのにいろいろと調べてみた。どのフィルターも基本的にはヨーロッパ系の言語用で日本語には向かないんだけれども、一応日本語文を渡すとどうなるかも調べた。
Standard Analyzer
Tokenizer: Standard Tokenizer
Token Filter: Standard Token Filter, Lowercase Token Filter
/options
stopwords: ストップワードを定義可能。デフォルトでは空。
max_token_length: トークン最大長を指定可能。デフォルトでは255。
基本的には記号やスペースで区切るが、www.google.comのような'.'や"let's"の"'"は区切りに使用しないみたいなのでURLやメールアドレスを検索対象にできる。
日本語は1文字ずつ区切られる。
Simple Analyzer
Tokenizer: Lowercase Tokenizer
全部小文字化して、文字以外の記号/スペースで区切るだけ。
'www.google.com' => ['www', 'google', 'com']
日本語は記号での区切り以外はひとかたまり。
Whitespace Tokenizer
Tokenizer: Whitespace Tokenizer
スペースでのみ区切る。
Lowercase filterがかからないので大文字と小文字が区別されるのに注意。
日本語は記号での区切り以外はひとかたまり。
Stop Analyzer
Tokenizer: Lowercase Tokenizer
Token Filter: Stop Token Filter
/options
stopwords: ストップワードを定義可能。デフォルトでは"english stop words"。
stopwords_path: ストップワードはファイルでも定義可能。
Simple Analyzerの結果からストップワードを取り除く。
日本語は記号での区切り以外はひとかたまり。
Keyword Analyzer
Source TextをそのままTokenにするだけ
公式ドキュメントによればIDや郵便番号の検索に便利だそう
not_analyzedと同じ
Pattern Analyzer
/options
lowercase: lowercase化するかどうか。デフォルトではtrue
pattern: Token Separatorの正規表現。デフォルトでは"\W+"
flags: 正規表現のフラグ
stopwords: ストップワードを定義可能。デフォルトでは空。
トークンの区切りを自分で書くことができる。標準では"\W+"つまり1文字以上の[^A-Za-z0-9_]以外が区切りになる。
日本語は記号での区切り以外はひとかたまりになる。
Snowball Analyzer
Tokenizer: Standard Tokenizer
Token Filter: Standard Filter, Lowercase Filter, Stop filter, snowball filter
Snowball filterはArmenian, Basque, Catalan, Danish, Dutch,English, Finnish, French, German, German2, Hungarian, Italian, Kp, Lovins, Norwegian,Porter, Portuguese, Romanian, Russian, Spanish, Swedish, Turkishに対応したstemmer。(デフォルトは英語)
複数形を単数形に直す、活用形を原型に直すなどを行う。ただしそんなに精度が高いわけではない。(末尾のsを取る、とか単純なルールベースみたい)
Standard Analyzerに比べるとデフォルトでもある程度ストップワードを除去してくれるし、日本語でいうkuromoji的な形態素解析?もしてくれる。
英語に関してデフォルトのAnalyzerから選ぶのならこれが一番使いやすそう。
Language Filter
各言語ごとに設定されたAnalyzerがあるらしいけれども、詳細不明。
各言語ごとにストップワードが定義されている程度だと思う。