如何将 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"
  }
}