最近有客户反馈使用kibana的Maps功能无法展示经纬度坐标数据。
排查思路:
基于客户配置的索引,在Maps中进行地图的配置,在配置视图后,发现异常报错
异常错误显示获取geo_point类型字段“geoip_location”字段。初步推断是由于字段类型不匹配导致在地图渲染时无法根据声明为geo_point类型字段进行经纬度坐标的渲染。
排查客户侧索引字段配置:
在模板中客户侧配置做了将对应的location字段声明为geo_point类型(这一步是正确的)
在具体的字段中客户对location字段重新进行了类型的指定
将经度和纬度都指定为了float类型。
援引官方文档对于经纬坐标的解释:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/lat-lon-formats.html
location
字段被声明为geo_point
后,我们就可以索引包含了经纬度信息的文档了。经纬度信息的形式可以是字符串、数组或者对象;
官方文档关于location字段配置如下:
代码语言:javascript复制PUT /attractions
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"location": {
"type": "geo_point"
}
}
}
}
将字段类型直接设置为geo_point类型。
基于官网描述 三种不同的方式进行数据的put;
代码语言:javascript复制PUT /attractions/_doc/1?pretty {"name":"Chipotle Mexican Grill","location":"40.715, -74.011"}
PUT /attractions/_doc/2?pretty {"name":"Pala Pizza","location":{"lat":40.722,"lon":-73.989}}
PUT /attractions/_doc/3?pretty {"name":"Mini Munchies Pizza","location":[-73.983,40.719]}
然后进行地图的创建测试;是可以进行经纬度渲染的。
然后基于客户侧索引 进行字段的调整(只保留关键字段,其他字段省略)
代码语言:javascript复制PUT /test-ip-map
{
"aliases" : { },
"mappings" : {
"dynamic_templates" : [
{
"geoip.location" : {
"match" : "geoip.location",
"mapping" : {
"type" : "geo_point"
}
}
}
}
],
"properties" : {
"geoip" : {
"properties" : {
"location" : {
"type" : "geo_point"
}
}
}
}
}
然后将客户索引的经纬度数据reindex进新索引之后
location字段会被自动解析为经度和纬度
然后在进行地图的创建与测试
原因分析:
由于客户索引中为location字段专门指定了float类型,虽然在模板中进行了geo_point的声明,但是数据在写入索引后,Maps不能够正确识别。所以在经纬度字段直接使用geo_point类型即可。
配置地图的步骤
1.创建包含location字段的索引;并正确写入数据。
2.基于需要展示经纬度数据的索引,在 index pattern中创建相应的视图。
3.在Kibana Maps中 create new map ;
4.点击add layer,为地图添加数据源;
5.选择Documents,添加数据源;
6.选择之前已经创建完成的视图
7.然后Maps会自动根据配置的视图,去扫描索引中包含的location字段,同时可以设置不同的结果集返回选项。
8.然后点击add layer;添加地图名称,设置相关图层参数(如果使用默认可以不用修改图层参数);点击保存,即可在地图中渲染出对应视图下包含的索引的经纬度坐标;
Maps加载数据的原理与discover功能较为类似。
在地图生效后,即可在顶部的搜索框添加filter,或者编写KQL语句,进行数据的过滤与查询
Kibana Maps功能官方文档链接;目前只有6.8版本参考;7.x版本暂未更新
https://www.elastic.co/guide/en/kibana/6.8/maps-getting-started.html