-Indexやらanalyzerやらmappingやらのお話

#contents

*kibana上での扱い [#n416ac40]

kibanaでは数値型じゃない項目に対して集計をかけることができない。なのでmappingはきちんと定義しておく必要がある。またindex指定時にフィールドメタデータを読み込むので、更新した場合はkibana側でリフレッシュをかける必要がある。

*analyzer [#pf74e61e]

-analyzerとはtokenizer,filterなどをひとまとまりに定義したもの。tokenizerはluceneのものもある

**tokenizer一覧 [#s54df945]

|standard|一文字だけ|
|edgeNGram||
|nGram||
|simple|スペース区切り|

***NGram Tokenizer [#z09ac1fa]

nGram

-elasticsearch.ymlでbigram設定

 # test
 # default analayzer(2-gram)
 index.analysis.analyzer.default.tokenizer: custom_bigram_tokenizer
 index.analysis.tokenizer.custom_bigram_tokenizer.type: nGram
 index.analysis.tokenizer.custom_bigram_tokenizer.min_gram: 2
 index.analysis.tokenizer.custom_bigram_tokenizer.max_gram: 2
 index.analysis.tokenizer.custom_bigram_tokenizer.token_chars.0: letter
 index.analysis.tokenizer.custom_bigram_tokenizer.token_chars.1: digit
 index.analysis.tokenizer.custom_bigram_tokenizer.token_chars.2: symbol


***Whitespace Tokenizer [#h88715f1]

空白区切り

***Pattern Tokenizer [#x632eb03]



***Lowercase Tokenizer [#a0a9a109]

Letter Tokenizerの後にLower case Token Filterをかけたものと全く一緒だが、パフォーマンス場はこちらが有利。

***Letter Tokenizer [#b7c01214]

テキストじゃない部分(空白やらピリオドやら)で分割する。ほとんどのヨーロッパ言語ではうまくいくがアジア系の言語だとひどいことになる。

***Keyword Tokenizer [#jf6fa0b2]


keywordが全入力を一つの単位として扱う。



|kuromoji|日本語の形態素解析|

**analyzerの挙動確認 [#lab19023]

-インデックスtestのデフォルトアナライザー

  curl 'localhost:9200/test/_analyze?pretty' -d 'こんにちは世界'

-アナライザーの指定も可能

 curl 'localhost:9200/test/_analyze?pretty=1&analyzer=my_ngram_analyzer' -d 'Database + fulltext=search'

*kuromoji徹底調査 [#w3fedca0]

日本語アナライザーであるkuromojiの調査結果。実際に試してみるのが一番早い。コアのプラグインには指定されているが、利用にはインストールが必要。

https://github.com/elastic/elasticsearch-analysis-kuromoji/tree/v2.7.0/#version-270-for-elasticsearch-17

**構成要素 [#ke144bad]

kuromoji_tokenizer以外はフィルター。ほぼ全てを組み合わせて使うらしい。

|kuromoji_tokenizer|通常の形態素解析|
|kuromoji_baseform|動詞形容詞の基本形を解析する|
|kuromoji_part_of_speech|part_of_speechで指定した品詞を除去する|
|kuromoji_readingform token filter|漢字→ひらがなorローマ字|

**参考サイト [#n3e37910]

+http://christina04.hatenablog.com/entry/2015/02/02/225734
+http://createfield.com/Elasticsearch%E3%81%AE%E3%82%A2%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%B6%E3%83%BC%E3%82%92%E8%A9%A6%E3%81%99%E6%96%B9%E6%B3%95

**mapping [#nb72fd6d]

***mappingの基礎 [#bb20cfca]

UserAgentなどの用に空白で区切られた文字列をデフォルトで取り込むと解析されてしまい、ブラウザごとのシェアなどが正しく判定できない。全文一致のみ利用するのであればnot_analyzedを指定する。ただしそれだけだと今後は部分一致ができなくなるので部分一致用の設定も入れてあげる必要がある。Multi-Fieldと呼ばれていたが2.0以降ではやり方が違う。

-フィールドごとに型定義をし、analyzerの設定も行う

 "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"
        }
      }
    }
  }

*参考サイト [#ac856bab]

+http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html
+http://christina04.hatenablog.com/entry/2015/02/02/225734
+https://medium.com/hello-elasticsearch/elasticsearch-833a0704e44b#.b5xjzm5a3

#counter

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS