在Kibana坐标地图中无法展示Elasticsearch地理空间数据问题排查
Kibana坐标地图无法展示location字段的原因与解决办法
你猜的完全没错!问题确实出在location字段的数据类型上。从你贴出的索引映射片段能清楚看到,当前的location是一个普通的object类型,里面只是存了lat和lon两个float类型的子字段,但Kibana的坐标地图组件只认geo_point这种专门的地理空间类型字段,所以才会啥内容都显示不出来。
为什么会这样?
- Elasticsearch里的地理空间查询、可视化(比如Kibana地图)都依赖
geo_point类型——这种类型会把经纬度数据解析成适合空间计算的格式,而普通的object字段只是把两个数值存起来,Elasticsearch根本不会把它们当成地理坐标处理。 - 你的文档结构虽然有
lat和lon,但没把它们标记成地理坐标,自然没法被地图组件识别。
几种可行的解决方案
方案1:修改映射+重新导入数据(最推荐,长期稳定)
已经创建的索引字段类型没法直接修改,所以得重新建索引并设置正确的映射:
- 先创建新索引,把
location设为geo_point类型(刚好你的文档是{"lat": x, "lon": y}的格式,geo_point完全支持这种写法):
PUT /new-logstash-2018.05.10 { "mappings": { "doc": { "properties": { "location": { "type": "geo_point" }, // 其他原有字段的映射照搬过来就行 } } } }
- 用
_reindexAPI把原索引的文档迁移到新索引:
POST _reindex { "source": { "index": "logstash-2018.05.10" }, "dest": { "index": "new-logstash-2018.05.10" } }
- 在Kibana里配置新索引的模式,之后就能在坐标地图里选
location字段正常展示了。
方案2:用Ingest Pipeline生成新的地理字段(不用重建索引)
如果不想折腾重建索引,可以通过Ingest Pipeline给现有文档加一个geo_point类型的新字段:
- 创建一个pipeline,提取原
location里的经纬度,生成geo_location字段:
PUT _ingest/pipeline/add-geo-point { "description": "从location的lat和lon生成geo_point字段", "processors": [ { "geo_point": { "field": "location", "target_field": "geo_location" } } ] }
- 执行更新,把这个pipeline应用到所有现有文档:
POST logstash-2018.05.10/_update_by_query?pipeline=add-geo-point
- 之后在Kibana里用新的
geo_location字段就能展示地图了。
方案3:临时救急——Kibana脚本字段(不适合大数据量)
如果只是临时想看一下数据,不想动索引,可以在Kibana里创建脚本字段:
- 进入Kibana的管理 > 索引模式,选中你的索引模式。
- 切换到脚本字段标签,点添加脚本字段。
- 字段名设为
geo_location,类型选地理坐标点。 - 脚本里输入:
doc['location.lat'].value + ',' + doc['location.lon'].value
- 保存后就能在地图里选这个字段了,不过这种方式性能很差,数据多了会卡顿,只适合临时用。
内容的提问来源于stack exchange,提问作者Alessio Frabotta
相关产品推荐
相关产品推荐

