首页 > 解决方案 > Elasticsearch 部分更新 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"
    }]
}

标签: elasticsearchelasticsearch-painless

解决方案


您可以尝试使用以下脚本。
我故意格式化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;}"

推荐阅读