如何向Elasticsearch中符合条件的nested嵌套属性插入新节点
解决方案
前置检查
首先确认字段拼写一致性:你提供的Mapping中顶层嵌套字段名是level_l(末尾为小写字母L),但插入文档中顶层字段为level_1(末尾为数字1),若为笔误请先修正统一,否则所有更新操作都会失效。
单文档精准更新方案
如果已知需要更新的文档ID,使用_update接口配合Painless脚本实现嵌套数组指定位置插入,示例请求如下(假设索引名为test_index,文档ID为1,新节点参数可自定义):
POST /test_index/_update/1 { "script": { "lang": "painless", "source": """ for(def item : ctx._source.level_1) { if(item['level_2-1'] == 'a') { // 兼容level_2-2为空的场景,避免空指针报错 if(item['level_2-2'] == null) { item['level_2-2'] = []; } item['level_2-2'].add(params.new_node); break; } } """, "params": { "new_node": { "level_3-1": "d1", "level_3-2": "d2", "level_3-3": "d3" } } } }
批量更新方案
如果需要更新所有包含level_2-1 = a的文档,使用_update_by_query接口:
POST /test_index/_update_by_query { "query": { "nested": { "path": "level_1", "query": { "term": { "level_1.level_2-1": "a" } } } }, "script": { "lang": "painless", "source": """ for(def item : ctx._source.level_1) { if(item['level_2-1'] == 'a') { if(item['level_2-2'] == null) { item['level_2-2'] = []; } item['level_2-2'].add(params.new_node); break; } } """, "params": { "new_node": { "level_3-1": "d1", "level_3-2": "d2", "level_3-3": "d3" } } } }
低版本ES兼容说明
如果你的ES版本不支持三引号包裹多行脚本,可将脚本内容压缩为单行,转义内部引号即可。
内容的提问来源于stack exchange,提问作者Fernando Ariza Serrano
相关产品推荐
相关产品推荐

