对象的 Elasticsearch 部分更新(multi=True)

Elasticsearch partial update of Object(multi=True)

如何使用字段映射更新文档 Object(multi=True), 当文档可以同时具有单个值(字典)和多个值(字典列表)时。

同一索引中的文档示例:

items中的单个值:

{
    "title": "Some title",
    "items": {
        "id": 123,
        "key": "foo"
    }
}

items 中的多个值:

{
    "title": "Some title",
    "items": [{
        "id": 456,
        "key": "foo"
    }, {
        "id": 789,
        "key": "bar"
    }]
}

您可以尝试使用以下脚本
我故意格式化 inline 属性以显示里面的内容。

POST index_name/_update_by_query
{
    "search": {
        "term": {
            "items.key": "foo"
        }
    },
    "script": {
        "inline": "
            if (ctx._source.items instanceof List) {
                for (item in ctx.source.items) {
                    if (item.key == params.old_value) {
                        item.key = params.new_value;
                        break;
                    }
                }
            } else {
                ctx._source.items.key = params.new_value;
            }
        ",
        "params": {"old_value": "foo", "new_value": "bar"},
        "lang": "painless'
    }
}

要使其正常工作,请将 inline 属性替换为单行值。

"inline": "if (ctx._source.items instanceof List) {for (item in ctx.source.items) {if (item.key == params.old_value) {item.key = params.new_value;break;}}} else {ctx._source.items.key = params.new_value;}"