如果您想对一个nested字段进行追加而不是覆盖,则可以使用nested字段的inner_hits功能。
具体来说,您可以使用nested查询来定位到您想要追加数据的特定嵌套文档,然后使用inner_hits来返回该嵌套文档及其所有现有的嵌套文档。接下来,您可以从返回的inner_hits结果中提取现有的数组数据,将新的数据追加到现有数据中,然后使用一个嵌套的更新查询来将更新后的数据写回到Elasticsearch中。
下面是一个示例,它演示了如何使用inner_hits来获取现有数据、追加新数据并将所有数据写回到Elasticsearch中:
```json
POST my_index/_update_by_query
{
"query": {
"nested": {
"path": "my_nested_field",
"query": {
"match": {
"my_nested_field.id": "123"
}
},
"inner_hits": {}
}
},
"script": {
"source": """
def nestedDoc = ctx._source.my_nested_field.stream().filter(n -> n.id == params.id).findFirst().orElse(null);
if (nestedDoc != null) {
List newValues = params.values + nestedDoc.values;
ctx._source.my_nested_field.removeIf(n -> n.id == params.id);
ctx._source.my_nested_field.add([
"id": params.id,
"values": newValues
]);
}
""",
"params": {
"id": "123",
"values": ["new_value_1", "new_value_2"]
}
}
}
```
在这个示例中,我们使用了一个更新查询来定位到具有“id”等于“123”的特定嵌套文档。我们使用inner_hits来获取现有的“values”数组,然后将新的值追加到现有的值中。最后,我们使用一个嵌套的更新脚本来写回更新后的数据。
请注意,这只是一个示例代码,您需要根据您的实际数据模型和具体需求来做出相应的调整。