【问题标题】:Delete only fields from all the documents that match my criteria从所有符合我的条件的文档中只删除字段
【发布时间】:2019-03-25 16:02:20
【问题描述】:

要从所有文档中删除任何具有值的字段而不从 Elasticsearch 索引中删除整个文档,我通常使用 _update_by_query API 调用和 script

例如: my_properties 索引上的所有字段,例如 (key=>value) 从它存在的所有文档中删除。使用下面的查询,我可以删除所有存在的 feed 字段,但在这种情况下,feed 字段是 text/string 类型

索引:my_properties

字段:供稿

类型:文字

Feed 上的示例值: feed: ["AB-1234"]

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.remove('feed')",
    "query" : {
        "exists": { "field": "feed" }
    }
}

我的主要问题是当我的字段类型是 nested 而不是 text/string

索引:my_properties

字段:feed_v2

类型:嵌套

feed_v2 上的示例值: feed_v2: [{"feed":12},{"id":["AB-9999"]}]

方法一:

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.remove('feed_v2')",
    "query" : {
        "exists": { "field": "feed_v2" }
    }
}

方法2:

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.feed_v2.remove('feed')",
    "query" : {
        "exists": { "field": "feed_v2.feed" }
    }
}

没有任何效果,我错过了什么吗?不确定,但我的猜测是-

"query" : {"exists": { "field": "feed_v2" }}

查询存在不能与嵌套类型字段相同,这就是它的原因 尝试删除 nested 类型字段时找不到任何内容

根据参考:https://stackoverflow.com/a/53771354/1138192 它应该对我有用,但可惜它对我不起作用。

【问题讨论】:

    标签: elasticsearch elasticsearch-painless amazon-elasticsearch


    【解决方案1】:

    Elasticsearch 有一个 Nested Datatype 的概念,为此只有 Nested Query 会提供帮助。基本上,您的存在查询将采用以下形式:

    检查字段是否存在的嵌套查询:

    POST <your_index_name>/_search
    {
      "query": {
        "nested": {
          "path": "feed_v2",
          "query": {
            "exists": {
              "field": "feed_v2.feed"
            }
          }
        }
      }
    } 
    

    您正在寻找可以帮助您从嵌套文档中删除嵌套字段的查询,我为此编写了以下脚本。

    嵌套文档与普通文档有何不同,根据link每个嵌套对象都被索引为隐藏的单独文档,因此您正在使用的查询不起作用.

    通过查询脚本更新嵌套文档以删除字段

    这适用于您只想删除feedfield_v2.feed 但您想保留其余field_v2 字段的情况。

    POST resumes/_update_by_query
    {
      "query": {
        "match_all": {}
      },
      "script": {
        "lang": "painless",
        "inline": """
          for(int i=0; i<ctx._source.field_v2.size(); i++)
          {
            HashMap myKV = ctx._source.field_v2.get(i);
            if(myKV.get(params.key_ref)!=null){
              myKV.remove(params.key_ref);
            }
          }
        """,
        "params": {
          "key_ref": "feed"
      }}
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2021-09-29
      • 2021-04-04
      • 2013-08-26
      相关资源
      最近更新 更多