実現したいこと
悩みはタイトル通りなのですが、これまで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で選択できません。
さてどうしよう。
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が表示されます。