Elasticsearch:在嵌套对象中删除/更新字段

时间:2016-08-03 10:58:34

标签: elasticsearch groovy

(n < 300)

这是我的文档架构。{ "_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内的特定字段。我可以使用groovy脚本更新list_data字段。

count

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

例如,我想将其添加到$ 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 } ] } } = 122执行删除,我的记录应该是

list_id

4 个答案:

答案 0 :(得分:6)

要在嵌套字段中添加新元素,可以按以下步骤操作:

$ 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
    }
}'

答案 1 :(得分:0)

我不知道为什么,但是我发现

ctx._source.list_data.removeAll{it.list_id == remove_id}

无法工作。相反,我像这样使用removeIf

ctx._source.list_data.removeIf{list_item -> list_item.list_id == remove_id}

其中list_item可以是任意字符串。

答案 2 :(得分:0)

对我有用的是以下link中的说明。也许是ES的版本。

答案 3 :(得分:0)

使用最新版本的ElasticSearch(7.9.0。)时出现错误[UpdateRequest] unknown field [params],似乎语法有所更改。

以下内容适用于新版本的ElasticSearch:

$ curl -XPOST 'localhost:9200/<index-name>/_update/1212'
{
  "script": {
    "source": "ctx._source.list_data.removeIf(list_item -> list_item.list_id == params.remove_id);",
    "params": {
      "remove_id": 122
    }
  }
}