kibanaでは数値型じゃない項目に対して集計をかけることができない。なのでmappingはきちんと定義しておく必要がある。またindex指定時にフィールドメタデータを読み込むので、更新した場合はkibana側でリフレッシュをかける必要がある。
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'
日本語アナライザーであるkuromojiの調査結果。実際に試してみるのが一番早い。コアのプラグインには指定されているが、利用にはインストールが必要。
kuromoji_tokenizer以外はフィルター。ほぼ全てを組み合わせて使うらしい。
kuromoji_tokenizer | 通常の形態素解析 |
kuromoji_baseform | 動詞形容詞の基本形を解析する |
kuromoji_part_of_speech | part_of_speechで指定した品詞を除去する |
kuromoji_readingform token filter | 漢字→ひらがなorローマ字 |
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" } } } }