【问题标题】:ElasticSearch - Bulk update on a nested list object fieldsElasticSearch - 嵌套列表对象字段的批量更新
【发布时间】:2021-03-14 15:29:26
【问题描述】:

所以我有一个场景,我有很多数据,我必须更新嵌套列表对象中的一个字段。所以我使用批量更新,我能够更新_source 中的字段。这就是数据的样子以及我如何能够更改 documentType。

"_source" : {
  "accountId" : "7ef72993-a068-4c1f-89ca-f12183a78517",
  "uuid" : "abdefc35-14c8-40a9-b6cf-203b4462934a",
  "documentType" : "pdf",
  "details" : [
    {
      "name" : "abhi",
      "age" : 21
    }
  ]
}

我能够批量更新 documentType 的方式是:

POST _bulk
{ "update" : {"_id" : "abdefc35-14c8-40a9-b6cf-203b4462934a",  "_index" : "model_index"} }
{ "doc" : {"documentType" : "jpg"}}

我在这里只展示了一个示例,但我必须在 10K 文档上运行它,但现在我要做的是更新 details 字段名称属性。所以一件事是 details 字段是一个总是包含一个元素的列表。 (不知道为什么要这样设计,可能是为了未来的增强)。

现在我陷入困境的是我无法解析该详细信息列表。如果我指定第零个索引(如details[0]),我尝试的方法无济于事,然后它会使用该值创建一个新字段为details[0],如果我只尝试使用名称字段,那么它会使用该字段更新整个详细信息对象,如下所示:

POST _bulk
{ "update" : {"_id" : "abdefc35-14c8-40a9-b6cf-203b4462934a",  "_index" : "model_index"} }
{ "doc" : {"details" : [{"name": "abhi"}]}}

-------------------------------------------------

"_source" : {
  "accountId" : "7ef72993-a068-4c1f-89ca-f12183a78517",
  "uuid" : "abdefc35-14c8-40a9-b6cf-203b4462934a",
  "documentType" : "jpg",
  "details" : [
    {
     "name" : "abhi"
    }
  ]
}

那么现在如何使用批量更新来更新详细信息列表名称属性的第零索引。即使有另一种方法可以更新具有不同名称的不同文档,我们也将不胜感激。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您需要的是script within your _bulk call。但是由于您不能在一次调用中同时拥有docscript,因此您可以在脚本中进行这两种替换。

    扩展(更易读)形式:

    POST _bulk
    {
      "update": {
        "_id": "abdefc35-14c8-40a9-b6cf-203b4462934a",
        "_index": "model_index"
      }
    }
    {
      "script": {
        "source": """
          if (params.documentType != null) {
            ctx._source.documentType = params.documentType;
          } else if (params.name != null) {
            ctx._source.details[0].name = params.name
          }
        """,
        "params": {
          "name": "abhi_1400",
          "documentType": "jpg"
        }
      }
    }
    

    紧凑(语法有效)形式:

    POST _bulk
    {"update":{"_id":"abdefc35-14c8-40a9-b6cf-203b4462934a","_index":"model_index"}}
    {"script":{"source":"if (params.documentType != null) {ctx._source.documentType = params.documentType} else if (params.name != null) { ctx._source.details[0].name = params.name }","params":{"name":"abhi_1400","documentType":"jpg"}}}
    

    【讨论】:

    • 感谢乔的快速回答。是的,所以我能够让它与脚本一起使用 for 循环,因为到目前为止,详细信息始终只有第零个索引。
    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多