如何将 ElasticSearch 中的现有坐标转换为地理点
How to convert existing coordinates in ElasticSearch to geopoints
我正在尝试在 ElasticSearch 中将纬度和经度转换为 geo_points。问题是,我已经在 elasticsearch 中上传了数据的纬度和经度值,但在转换它们时遇到了问题。我感觉有一个使用 painless 的解决方案,但还没有完全确定它。
这就是映射的样子
{
"temporary_index" : {
"mappings" : {
"handy" : {
"properties" : {
"CurrentLocationObj" : {
"properties" : {
"lat" : {
"type" : "float"
},
"lon" : {
"type" : "float"
}
}
},
"current_latitude" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"current_longitude" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"location" : {
"type" : "geo_point"
},
}
}
}
}
}
这就是示例文档的样子
"hits" : [
{
"_index" : "temporary_index",
"_type" : "handy",
"_id" : "9Q8ijmsBaU9mgS87_blD",
"_score" : 1.0,
"_source" : {
"current_longitude" : "139.7243101",
"current_latitude" : "35.6256271",
"CurrentLocationObj" : {
"lat" : 35.6256271,
"lon" : 139.7243101
}
显然还有更多的字段,但为了清楚起见,我将它们删除了。
这是我试过的。
POST temporary_index/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"inline": "ctx._source.location = [ctx._source.current_latitude, ctx._source.current_longitude]",
"lang": "painless"
}
}
但是我收到以下错误:
"reason": "failed to parse field [location] of type [geo_point]",
"caused_by": {
"type": "parse_exception",
"reason": "unsupported symbol [.] in geohash [35.4428348]",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "unsupported symbol [.] in geohash [35.4428348]"
}
}
我使用以下 Whosebug 作为我的解决方案的基础,但我显然做错了什么。任何建议都是有帮助的!谢谢。
好的开始!你快到了。
请注意,当指定geo_point
as an array时,经度必须是第一个元素,然后是纬度。但是,我建议您改为这样做,它会起作用:
POST temporary_index/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"inline": "ctx._source.location = ['lat': ctx._source.current_latitude, 'lon': ctx._source.current_longitude]",
"lang": "painless"
}
}
我正在尝试在 ElasticSearch 中将纬度和经度转换为 geo_points。问题是,我已经在 elasticsearch 中上传了数据的纬度和经度值,但在转换它们时遇到了问题。我感觉有一个使用 painless 的解决方案,但还没有完全确定它。
这就是映射的样子
{
"temporary_index" : {
"mappings" : {
"handy" : {
"properties" : {
"CurrentLocationObj" : {
"properties" : {
"lat" : {
"type" : "float"
},
"lon" : {
"type" : "float"
}
}
},
"current_latitude" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"current_longitude" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"location" : {
"type" : "geo_point"
},
}
}
}
}
}
这就是示例文档的样子
"hits" : [
{
"_index" : "temporary_index",
"_type" : "handy",
"_id" : "9Q8ijmsBaU9mgS87_blD",
"_score" : 1.0,
"_source" : {
"current_longitude" : "139.7243101",
"current_latitude" : "35.6256271",
"CurrentLocationObj" : {
"lat" : 35.6256271,
"lon" : 139.7243101
}
显然还有更多的字段,但为了清楚起见,我将它们删除了。
这是我试过的。
POST temporary_index/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"inline": "ctx._source.location = [ctx._source.current_latitude, ctx._source.current_longitude]",
"lang": "painless"
}
}
但是我收到以下错误:
"reason": "failed to parse field [location] of type [geo_point]",
"caused_by": {
"type": "parse_exception",
"reason": "unsupported symbol [.] in geohash [35.4428348]",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "unsupported symbol [.] in geohash [35.4428348]"
}
}
我使用以下 Whosebug 作为我的解决方案的基础,但我显然做错了什么。任何建议都是有帮助的!谢谢。
好的开始!你快到了。
请注意,当指定geo_point
as an array时,经度必须是第一个元素,然后是纬度。但是,我建议您改为这样做,它会起作用:
POST temporary_index/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"inline": "ctx._source.location = ['lat': ctx._source.current_latitude, 'lon': ctx._source.current_longitude]",
"lang": "painless"
}
}