"_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
答案 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();
的详细信息
答案 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": {}
}