伸縮自在の愛 (5)

今までelasticsearchの記事で当たり前のようにAnalyzerAnalyzerといってきたが、Analyzerとはそもそも一体何なのだろうか?

その答えは、
Source Textに対して…

1. Char Filterで文字列を操作する
    ex) たとえば、を削除、'&'を'and'に変換する

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があるらしいけれども、詳細不明。
各言語ごとにストップワードが定義されている程度だと思う。