解决ELK地图可视化时无法识别location坐标(geo_point)及字段映射冲突问题
在使用ELK进行日志数据的可视化时,可以通过logstash地理插件(geoip)将IP地址转换为地理坐标,然后我们就可以利用坐标实现热力图、地区分布图等地图可视化数据。但是在实际操作过程中,在定制图表的时候,会出现无法识别地理坐标(geo_point)的问题,在此对如何解决该问题汇总一二。问题原因:kibana在绘制地图数据需要用到地理坐标数据时,必须是geo_point类型,如果locatio
在使用ELK进行日志数据的可视化时,可以通过logstash地理插件(geoip)将IP地址转换为地理坐标,然后我们就可以利用坐标实现热力图、地区分布图等地图可视化数据。
但是在实际操作过程中,在定制图表的时候,会出现无法识别地理坐标(geo_point)的问题,在此对如何解决该问题汇总一二。
问题原因:
kibana在绘制地图数据需要用到地理坐标数据时,必须是geo_point类型,如果location经纬度坐标是number或String类型,则会出现无法识别的问题。
解决方案:
1)在Logstash输出数据至ES时指定映射模板(template),将location转换为geo_point类型;此方式的说明文章挺多,在此不再赘述。
2)在ES创建index template,在template的mapping配置中指定client.geo.location为geo_point类型;
PUT /_template/zglive_template
{
"order" : 1,
"version" : 1,
"index_patterns" : [
"zglive-*"
],
"settings" : { },
"aliases" : { },
"mappings" : {
"properties" : {
"client": {
"properties": {
"geo": {
"properties": {
"location": {
"type" : "geo_point"
}
}
}
}
}
}
}
}
index template应用成功后,新生成的索引字段中cliet.geo.location字段类型已经变成geo_point类型,如图:
index template只会对新生成的索引生效,已经存在的索引不会发生变化。
采坑记录:
1)通过以上方法指定index template后,Elasticsearch基于匹配索引名的索引模式将模板应用于新索引。之前产生的索引并不会自动应用模板实现字段的转换,这会导致mapping conflict(字段映射冲突问题)。解决方法:reindex(重建索引),您可以结合使用_reindex和Painless来重新索引每日索引,以便将新模板应用于现有文档。
POST _reindex
{
"source": {
"index": "zglive-*"
},
"dest": {
"index": "zglive"
},
"script": {
"lang": "painless",
"source": "ctx._index = 'zglive-' + (ctx._index.substring('zglive-'.length(), ctx._index.length())) + '-1'"
}
}
通过_reindex配合painless重建每日索引,索引重建后,删除旧索引即可。
2)索引重建或更新后,index pattern并不会自动更新字段信息,需要手动刷新,如下图所示:
当前index pattern覆盖的所有索引字段冲突问题解决后,需要手动刷新才能看到冲突解决后的正确的字段信息。
总结:
使用ELK的地理插件获取地理信息后,需要进行字段映射将client.geo.location字段映射为geo_point类型,如果在已有索引的情况下新增字段映射,会导致新旧索引的字段映射冲突(mapping conflict),解决字段映射冲突的办法是重建旧索引。
更多推荐
所有评论(0)