更新文档,以便它将更新数组字段中的特定项目

时间:2020-04-28 08:09:04

标签: elasticsearch

在Elasticsearch中,说我有这样的文档:

{
  "inputs": [
    {
      "id": "1234",
      "value": "ABCD"
    },
    {
      "id": "5678",
      "value": "EFGH"
    }
  ]
}

说,现在,我想将id为“ 1234”的所有项目的值更新为“ XYZA”。如何在Elasticsearch中使用脚本来做到这一点?我不确定是否可以在脚本中执行一些for循环操作?

1 个答案:

答案 0 :(得分:0)

映射:

{
  "inputs" : {
    "mappings" : {
      "properties" : {
        "inputs" : {
          "type" : "nested",
          "properties" : {
            "id" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "value" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
  }
}

查询:

您可以使用_update_by_query api。查询部分将过滤掉文档,脚本将更新字段

<1. When inputs is of nested type

POST inputs/_update_by_query
{
  "script": {
    "source": "for(a in ctx._source['inputs']){if(a.id=='1234') a.value=params.new_value; }",
    "params": {
        "new_value": "XYZA"
    }
  },
  "query": {
     "nested":{
       "path":"inputs",
        "query":{
          "term":{
            "inputs.id":1234
          }
        }
     }
  }
}

2. When inputs if of object type

POST inputs/_update_by_query
{
  "script": {
    "source": "for(a in ctx._source['inputs']){if(a.id=='1234') a.value=params.new_value; }",
    "params": {
      "new_value": "XYZA"
    }
  },
  "query": {
    "term": {
      "inputs.id": 1234
    }
  }
}


结果:

"hits" : [
      {
        "_index" : "inputs",
        "_type" : "_doc",
        "_id" : "3uwrwHEBLcdvQ7OTrUmi",
        "_score" : 1.0,
        "_source" : {
          "inputs" : [
            {
              "id" : "1234",
              "value" : "XYZA"
            },
            {
              "id" : "5678",
              "value" : "EFGH"
            }
          ]
        }
      }
    ]