更新弹性搜索嵌套索引值

时间:2020-04-16 11:17:04

标签: elasticsearch elasticsearch-5

我在弹性搜索中有一个具有嵌套值的索引,我想用ID更新嵌套索引中的值,我该如何实现。我的索引就像

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "a",
                "_type": "a1",
                "_id": "my-index1",
                "_score": 1.0,
                "_source": {
                    "id": "my-index1",
                    "name": "firstIndex",
                    "metals": [
                        {
                            "id": "123",
                            "name": "Ronni",   
                        },
                         {
                            "id": "124",
                            "name": "Ross",   
                        }
                    ]
                }
            }
        ]
    }
}

如何借助“ Id” -124用“莫妮卡”更新“罗斯”?

1 个答案:

答案 0 :(得分:1)

假设您的metalsnested datatype的对象(而不仅仅是一个简单的嵌套数组),则可以先使用nested术语查询来限制要更新的文档,然后使用循环的script执行更改:

POST my-index1/_update_by_query
{
  "query": {
    "nested": {
      "path": "metals",
      "query": {
        "term": {
          "metals.id": "124"
        }
      }
    }
  },
  "script": {
    "source": """
      for (def i = 0; i < ctx._source.metals.length; i++) {
        def group = ctx._source.metals[i];
        if (group['id'] == params['old_metal_id']) {
          ctx._source.metals[i]['name'] = params['new_metal_name']
        }

      }
    """,
    "params": {
      "old_metal_id": "124",
      "new_metal_name": "Monika"
    }
  }
}