ES5で形態素解析した結果がaggrigationできない。

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

実現したいこと

  • kibanaのvisualizeで、Aggregation -> Termで形態素解析結果のフィールドを選択し、集計できるようにしたい。
    • 以下のmapping例で、text.jaを選択できるようにしたい
  • kuromojiで形態素解析する場合としない場合の両方を利用したいので、Multi Fieldを使いたい

いろいろelasticsearchのmappingをいじったのですが、、、
形態素解析自体はできているようなのですが、現時点では、kibana5からそのフィールドをvisualize時のfieldで選択できません。

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定義は以下の通りです。
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です。

以上、解決方法をご存知の方がいらっしゃったらご教示よろしくお願いします。

当方が持っている環境(5.1.1)で確認したところ、Analyze対象フィールドに ”fielddata”=true を設定するとaggregationで指定できるようになりました。

提示された例だと、こんな風に。

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

textを指定したフィールドで、デフォルトはfalseになっています。fielddataについては、こちらを参照しました。

aggregationに指定できるようになりますが、5,1,1でも4.x系のときと同じくWARNINGが表示されます。

Careful! The field selected contains analyzed strings. Analyzed strings are highly unique and can use a lot of memory to visualize. Values such as foo-bar will be broken into foo and bar. See Mapping Types for more information on setting this field as keyword (not analyzed).

おお!できました!
だいぶ悩んでいたのですが、自分のスキル不足を痛感しますね。

ver4ではどのような設定がデフォルトだったのかわかりませんが、String型のデータ回りのmappingの書き方が変わるに伴って、この辺の仕様も変更されたのでしょうかね。

ともあれ、解決できました。ありがとうございました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.