首页 > 解决方案 > 尝试更新 elasticsearch 中的嵌套 geoip 位置字段

问题描述

这是我尝试过的:

POST orders/_update_by_query
{
    "script" : "ctx._source.geoip += newElement",
    "params": {
        "newElement": {
           "location" : "[40.730610, -73.935242]"
        }
    },
  "query": {
    "term": {
      "CITY": {
        "value": "nyc"
      }
    }
  }
}

以上为 [params] 中的 START_OBJECT 抛出错误Unknown key。

第二次尝试:

POST orders/_update_by_query
{
  "script":{
    "source":
      "for (item in ctx._source.geoip){item.location = '[40.730610, -73.935242]'}",
      "lang":"painless"
  },
  "query": {
    "term": {
      "CITY": {
        "value": "nyc"
      }
    }
  }
}

上面抛出空指针异常,指向source.geoip处的句点

我还尝试将 location 的值更改为仅测试但收到相同的错误。

这是我的映射:

{
  "orders" : {
    "mappings" : {
      "properties" : {
        "geoip" : {
          "dynamic" : "true",
          "properties" : {
            "location" : {
              "type" : "geo_point"
            }
          }
        }
     }
}

我正在使用 ES v7.2 和 Kibana v7.2

标签: elasticsearchgeolocationkibanaelasticsearch-painless

解决方案


第一种方法中的几个问题:

  • params需要在脚本对象中定义,而不是在它下面
  • newElement需要使用params.newElement
  • 你不能附加+= params.newElement到一个不存在的ctx._source.geoip
  • 您不能将对象附加到单值字段 - 您可以分配它
  • locationgeo_point类型,所以是[40.730610, -73.935242]( [lon, lat]) 或"-73.935242,40.730610"( "lat,lon"),但不是两者的混合

工作命令:

POST orders/_update_by_query
{
  "script": {
    "inline": "ctx._source.geoip = params.newElement",
    "params": {
      "newElement": {
        "location": [
          40.73061,
          -73.935242
        ]
      }
    }
  },
  "query": {
    "term": {
      "CITY": {
        "value": "nyc"
      }
    }
  }
}

推荐阅读