尝试在 elasticsearch 中更新嵌套的 geoip 位置字段

Trying to update a nested geoip location field in elasticsearch

这是我试过的方法:

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

以上抛出错误 Unknown key for a START_OBJECT in [params].

第二次尝试:

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 的值更改为 test 但收到相同的错误。

这是我的映射:

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

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

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

  • params 需要在脚本对象中定义,而不是在它下面
  • newElement 需要使用 params.newElement
  • 访问
  • 您不能将 += params.newElement 附加到不存在的 ctx._source.geoip
  • 您不能将对象附加到单值字段 -- 您可以直接分配它
  • location 属于 geo_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"
      }
    }
  }
}