【发布时间】:2021-06-23 22:13:23
【问题描述】:
可以通过某种方式在 Elasticsearch 映射中定义 geo-point field type 并导入数据,但不能同时进行。在 JSON 数据中,位置字段如下所示
"location": {
"lat": 41.12,
"lng": -71.34
}
因为我们需要“lon”而不是“lng”,所以我们在 Logstash 配置中使用这个“mutate”过滤器来重命名字段:
mutate {
rename => {
"[location][lng]" => "[location][lon]"
}
}
如果我们不使用映射,那么 Elasticsearch 会自动为位置字段使用以下映射并导入数据
"location": {
"properties": {
"lat": {
"type": "float"
},
"lon": {
"type": "float"
}
}
}
到目前为止一切顺利。但是,如果我现在在创建索引时在 Elasticsearch 映射中使用“geo_point”,那么我将无法再导入任何数据,因为我收到错误消息“无法将非对象映射 [位置] 与对象映射合并” 在 Logstash 中 can happen 如果我们尝试更改映射。但是这里的映射已经用于创建索引:
"mappings":{
"properties":{
"location": {
"type": "geo_point",
"ignore_malformed": "true",
},
}
}
显然,Logstash 和 Elasticsearch 将映射中类型为 geo_point 的字段 location 视为不是对象,而该位置的 JSON 数据是对象。
虽然无法使用此映射在 Logstash 中导入数据,但我可以像这样将文档保存在 Kibana DEV Tools 中
PUT geo-test/_doc/1
{
"title": "Geo-point test",
"location": {
"lat": 41.12,
"lon": -71.34
}
}
如何使用地理点映射将数据导入 Logstash? (我使用的是 Elasticsearch 7.9.1 版和 Logstash 7.12.0 版,包括 S3 输入插件和 Elasticsearch 输出插件)
【问题讨论】:
-
你能分享你的
geo-test索引使用GET geo-test的有效映射吗? -
不可能创建一个从一开始就具有正确映射的 Elasticsearch 索引?我使用的映射列在以 ""mappings" 开头的代码块中。
-
我感兴趣的是当前在您的索引中的映射,而不是您认为在创建索引时使用的映射。经验表明,有时映射不是我们认为的那样。致电
GET geo-test,请分享您的收获 -
如果我打电话给
/geo-test/_mapping,我会得到这个映射。 -
请使用您获得的映射更新您的问题