【问题标题】:Adding/Updating nested documents to Nested datatypes - Elasticsearch将嵌套文档添加/更新到嵌套数据类型 - Elasticsearch
【发布时间】:2018-02-01 02:12:27
【问题描述】:

假设我有一个包含嵌套文档的文档:

{
    "dept_name" : "IT",
    "dept_code" : "IT",
    "staffs" : [
        {
            "emp_name" : "A",
            "emp_id" : "1",
            "emp_salary" : "10000"
        },
        {
            "emp_name" : "B",
            "emp_id" : "2",
            "emp_salary" : "20000"
        },
        {
            "emp_name" : "C",
            "emp_id" : "3",
            "emp_salary" : "30000"
        }
    ]
}

现在,我需要在嵌套类型中添加“staffs”,我已经知道如何做到这一点。以下是更新代码(添加到嵌套类型):

GET dept/dept/1/_update
{
    "script": {
    "lang": "painless",
    "inline": "ctx._source.staffs.add(params.dept);",
    "params": {
        "dept": {
                "emp_name" : "D",
                "emp_id" : "4",
                "emp_salary" : "40000"
            }
        }
    }
}

但是如果我需要更新一个或两个嵌套类型的字段怎么办。例如,我需要将“emp_salary”更新为“emp_id”= 3 的 35000。 如何做到这一点?为此我想出了如下方法(更新现有的嵌套类型):

GET dept/dept/1/_update
{
    "script": {
    "lang": "painless",
    "inline": """
        int i=0;
        for(LinkedHashMap obj:ctx._source.staffs){
        if(obj.id==params.dept.emp_id)
        {
            ctx._source.staffs[i]=params.dept;
        }


        i++;
    """,
    "params": {
        "dept": {
                "emp_name" : "C",
                "emp_id" : "3",
                "emp_salary" : "35000"
            }
        }
    }
}

我不确定这是否是一种有效的方法。 但我的主要问题是,我不能保留两个更新命令来实现这两个功能(添加新的嵌套文档和更新现有嵌套文档的字段)。我需要将两者合二为一。它应该像如果嵌套文档不存在那么它应该添加新的嵌套文档并且如果它存在那么它应该更新现有的嵌套文档一样工作。

【问题讨论】:

    标签: elasticsearch elastic-stack nested-types


    【解决方案1】:

    我找到了一种使用更新脚本的方法。 这是post的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2018-04-07
      • 2015-07-13
      • 2016-08-03
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多