standard | 一文字だけ |
edgeNGram | |
nGram | |
simple | スペース区切り |
nGram
空白区切り
Letter Tokenizerの後にLower case Token Filterをかけたものと全く一緒だが、パフォーマンス場はこちらが有利。
テキストじゃない部分(空白やらピリオドやら)で分割する。ほとんどのヨーロッパ言語ではうまくいくがアジア系の言語だとひどいことになる。
keywordが全入力を一つの単位として扱う。
kuromoji | 日本語の形態素解析 |
curl 'localhost:9200/test/_analyze?pretty' -d 'こんにちは世界'
curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'Database + fulltext=search'
UserAgentなどの用に空白で区切られた文字列をデフォルトで取り込むと解析されてしまい、ブラウザごとのシェアなどが正しく判定できない。全文一致のみ利用するのであればnot_analyzedを指定する。ただしそれだけだと今後は部分一致ができなくなるので部分一致用の設定も入れてあげる必要がある。Multi-Fieldと呼ばれていたが2.0以降ではやり方が違う。
"mappings": { "company": { "_source": { "enabled": true }, "_all": { "enabled": true, "analyzer": "kuromoji_analyzer" }, "properties": { "id": { "type": "integer", "index": "not_analyzed" }, "name": { "type": "string", "index": "analyzed", "analyzer": "ngram_analyzer" }, "location": { "type": "string", "index": "analyzed", "analyzer": "kuromoji_analyzer" } } }, "project": { "_source": { "enabled": true }, "_all": { "enabled": true, "analyzer": "kuromoji_analyzer" }, "_parent": { "type": "company" }, "properties": { "id": { "type": "integer", "index": "not_analyzed" }, "title": { "type": "string", "index": "analyzed", "analyzer": "kuromoji_analyzer" } } } }