Elasticsearch根据搜索查询更新整个`_source`字段

时间:2018-06-07 14:05:56

标签: elasticsearch elasticsearch-java-api

"_source": {
         "id": "5b1676493d21784208c36041",
         "label": "name",
         "properties": {
           "name": "patrick"
         },
         "updatedAt": 1528259039542
       }

我想根据id(不是_id)使用新文档更新此文档。

这样的事情:

    "_source": {
             "dataSource": "ELASTIC",
             "entity": "vertices",
             "label": "vertices",
             "id": "5b1676493d21784208c36041",
             "properties": {
                     "name": "patrick"
                  },
             "updatedAt": 1528259039542
           }

elasticsearch版本:6.2,ES Java api:6.2

3 个答案:

答案 0 :(得分:2)

你可以使用update by query API达到你想要的效果,基本上就是这样:

POST index/_update_by_query
{
  "query": {
    "match": {
      "id": "5b1676493d21784208c36041"
    }
  },
  "script": {
    "source": "ctx._source = params",
    "params": {
       "dataSource": "ELASTIC",
       "entity": "vertices",
       "label": "vertices"
    }
  }
}

更新:使用Java API

Map<String, String> params = new HashMap<>();
params.put("dataSource", "ELASTIC");
params.put("entity", "vertices");
params.put("label", "vertices");

UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
updateByQuery.source("index")
    .filter(QueryBuilders.matchQuery("id", "5b1676493d21784208c36041"))
    .size(1000)
    .script(new Script(ScriptType.INLINE, "painless", "ctx._source.putAll(params)", params));
BulkByScrollResponse response = updateByQuery.get();

有关使用UpdateByQuery Java APIJava high level rest client

的详细信息

答案 1 :(得分:0)

"ctx._source.putAll(params)"是不错的尝试,但不幸的是,它会将所有现有字段移到_source.ctx下。

因此,以下内容适用于我(ES 6.1):

"for (k in params.keySet()){if (!k.equals('ctx')){ctx._source.put(k, params.get(k))}}"

答案 2 :(得分:0)

感谢@jetnet提供了在地图中的所有条目之间循环的想法。当我使用脚本时,它仍在替换整个对象,因此必须按照以下说明对其进行调整,以保留更新操作期间未提供的字段。对于上下文,如果我首先插入一个包含三个对象(每个对象具有2个字段)的文档,然后再使用相同的3个对象(但每个对象具有1个字段)来更新该文档,则输出结果是我最终得到一个每个对象具有3个对象的文档用一个字段代替了原来的3个对象,每个对象只有2个字段。

我必须调整@jetnet的脚本,才能获得不覆盖对象属性的预期结果

POST /transaction_index/_update/33384637-3137-3132-5543-31304c4c3151
{
   "script": {
      "source": "if (ctx._source.Metadata == null || params.Metadata.Version >= ctx._source.Metadata.Version) { for (k in params.keySet()){ if (ctx._source[k] != null) { ctx._source[k].putAll(params.get(k)) } else { ctx._source.put(k, params.get(k)) } } } else { ctx.op = 'none' }",
      "params": {
         "Transaction": {
            "TransactionId": "33384637-3137-3132-5543-31304c4c3151",
            "TransactionKey": "Key1"
         },
         "Message": {
            "MessageId": "505a5953-374a-385a-4a48-52353549445a",
            "Context": "This is a test context"
         },
         "MessageDefinition": {
            "MessageDefinitionId": "a1c05e06-fa6b-40ce-992f-d083ff6c0243",
            "Code": 1010101010
         },
         "Metadata": {
            "Version": 1,
            "CreateTime": "2020-09-04T14:27:51.1986439+01:00",
            "IsLatest": true,
            "IsDummy": false,
            "VersionString": "20200903111111"
         }
    }
 },
 "scripted_upsert": true,
 "upsert": {}
}