一尘不染

Elasticsearch:嵌套对象中的remove / update字段

elasticsearch

{
  "_index" : "test",
  "_type" : "test",
  "_id" : "1212",
  "_version" : 5,
  "found" : true,
  "_source" : {
    "count" : 42,
    "list_data" : [ {
      "list_id" : 11,
      "timestamp" : 1469125397
    }, {
      "list_id" : 122,
      "timestamp" : 1469050965
    } ]
  }
}

这是我的文档架构。list_data是嵌套对象。我需要更新/删除其中的特定文件list_data。我能够count使用groovy脚本更新字段。

$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
    "script" : "ctx._source.count = 41"
}'

但是不知道如何更新嵌套对象。

例如,我想将此添加到中list_data

{
   "list_id" : 121,
   "timestamp" : 1469050965
}

并且我的文档应更改为:

{
  "_index" : "test",
  "_type" : "test",
  "_id" : "1212",
  "_version" : 6,
  "found" : true,
  "_source" : {
    "count" : 41,
    "list_data" : [ {
      "list_id" : 11,
      "timestamp" : 1469125397
    }, {
      "list_id" : 121,
      "timestamp" : 1469050965
    }, {
      "list_id" : 122,
      "timestamp" : 1469050965
    } ]
  }
}

如果我基于list_id= 122 执行删除,则我的记录应如下所示

{
  "_index" : "test",
  "_type" : "test",
  "_id" : "1212",
  "_version" : 7,
  "found" : true,
  "_source" : {
    "count" : 41,
    "list_data" : [ {
      "list_id" : 11,
      "timestamp" : 1469125397
    }, {
      "list_id" : 121,
      "timestamp" : 1469050965
    }]
  }
}

阅读 614

收藏
2020-06-22

共1个答案

一尘不染

要将新元素添加到嵌套字段,您可以像这样进行操作:

$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
    "script" : "ctx._source.list_data += newElement",
    "params": {
        "newElement": {
           "list_id" : 121,
           "timestamp" : 1469050965
        }
    }
}'

要从嵌套字段列表中删除现有元素,可以按以下步骤进行:

$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
    "script" : "ctx._source.list_data.removeAll{it.list_id == remove_id}",
    "params": {
        "remove_id" : 122
    }
}'
2020-06-22