18
- 2月
2017
Posted By : boomin
ElasticSearch ver5で形態素解析した結果がaggrigationできない。
Advertisements

実現したいこと

悩みはタイトル通りなのですが、これまでkibana4やElasticSearch4.xで実現できていたことが、ver5でできずに困っていました。

 

具体的には

  • kibanaのvisualizeで、Aggregation -> Termで形態素解析結果のフィールドを選択し、集計できるようにしたい。
    • 以下のmapping例で、text.jaを選択できるようにしたい
  • kuromojiで形態素解析する場合としない場合の両方を利用したいので、Multi Fieldを使いたい
    • v5でもこんな感じのことがしたい
    • http://qiita.com/harukasan/items/4ec517d8d96f557367e1

いろいろelasticsearchのmappingをいじってみたけど解決方法がわからず。
形態素解析自体はできているようだけど、kibana5からそのフィールドをvisualize時のfieldで選択できません。
さてどうしよう。

 

Advertisements

mapping定義

 

elasticsearch4のマッピング定義(抜粋)

ElasticSearch4の時のmapping定義は以下の通りです。

  {
  "template": "*",
  "mappings": {
    "_default_": {
      "_all": {
        "analyzer": "ja_analyzer"
      },
      "dynamic_templates": [{
        "analyzed_fields": {
          "match_pattern": "regex",
          "match": ".*text.*|.*text",
          "mapping": {
            "type": "string",
            "fields": {
              "raw": {
                "type": "string",
                "index": "not_analyzed"
              },
              "facet": {
                "type": "string",
                "analyzer": "facet_analyzer"
              },
              "ja": {
                "type": "string",
                "analyzer": "ja_analyzer"
              }
            }
          }
        }
      }, {
        "string_template": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "string",
            "fields": {
              "raw": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          }
        }
      }]
    }
  }
}

 

elasticsearch5のマッピング定義(抜粋)

ElasticSearch5の時のmapping定義は以下の通りです。
ver.5では、stringやらindex周りの書き方に変更があったので、以下のように変えています。

{
  "template": "*",
  "mappings": {
    "_default_": {
      "_all": {
        "analyzer": "ja_analyzer"
      },
      "dynamic_templates": [{
        "analyzed_fields": {
          "match_pattern": "regex",
          "match": ".*text.*|.*text",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type": "keyword"
              },
              "ja": {
                "type": "text",
                "analyzer": "ja_analyzer"
              },
              "yomi": {
                "type": "text",
                "analyzer": "yomi_analyzer"
              }
            }
          }
        }
      }, {
        "string_template": {
          "match_mapping_type": "string",
          "match": "*",
          "mapping": {
            "type": "keyword"
          }
        }
      }]
    }
  }
}

kibana4ではtext.rawもtext.jaも両方ともaggrigationの対象となっていたのでいろいろ集計できました。
しかし残念ながら、kibana5ではanalyzed された領域がaggregatable に対してtrueになりません。

なお、elasticsearch上にtext.raw、text.ja、text.yomiというフィールド自体は作成されており、
analyzed が有効(true)となっていますが、text.raw だけがaggregatable が有効(true)になっています。
そして、もちろんtext.raw のanalyzed はfalseです。

どうやって解決しよう。

 

解決方法

Analyze対象フィールドに ”fielddata”=true を設定するとaggregationで指定できるようになりました。
具体的には、こんな感じ。

"fields": {
  "raw": {
    "type": "keyword"
  },
  "ja": {
    "type": "text",
    "fielddata": true,
    "analyzer": "ja_analyzer"
  },

環境(5.1.1)で確認したところ、textを指定したフィールドで、デフォルトはfalseになっています。
fielddataについては、こちらを参照しました。
aggregationに指定できるようになりますが、5,1,1でも4.x系のときと同じくWARNINGが表示されます。

Advertisements
Category:

コメントを残す