【问题标题】:Elasticsearch - Remove field from a structureElasticsearch - 从结构中删除字段
【发布时间】:2019-10-29 15:56:51
【问题描述】:

我使用的是 Elasticsearch 6.5。
假设我的 Elasticsearch 文档如下所示:

"_source" : {
    "field1" : "val1",
    "field2" : "val2",
    "struct1" : {
      "inner_field1" : "inner val1",
      "inner_field2" : "inner val2",
    }
  }

我想删除此结构中的一个内部字段。
我尝试了以下代码:

POST test_idx1/_doc/1/_update
{
 "script": "ctx._source.remove('struct1.inner_field1');"
}

结果显示updated,但没有任何变化。
如何执行这样的操作?

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案1】:

    您可以通过这种方式从所有现有文档中删除字段

    POST test_idx1/_update_by_query?conflicts=proceed
    {
        "script" : "ctx._source.struct1.remove('inner_field1')",
        "query" : {
            "exists": { "field": "struct1.inner_field1" }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以分两步完成:

      GET test_idx1/_doc/1

      然后将 struct1inner_field1 作为部分文档更新删除:

      POST test_idx1/_update/1
      {
          "doc" : {
              "struct1" : {
                  "inner_field2" : "inner val2",
              }
          }
      }
      

      【讨论】:

      • 不幸的是,这个解决方案可能非常慢。如果struct1 有几十个字段,我只需要删除其中一个呢?
      • 你确定 struct1 需要成为一个对象吗?最好将字段建模为struct1-innerfield1 等,而不嵌套它们。这将简化您的查询和更新。
      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多