仅删除符合我的条件的所有文档中的字段

Delete only fields from all the documents that match my criteria

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

例如: on my_properties index 我想删除所有字段,例如 (key=>value) from它存在的所有文件。使用下面的查询,我可以删除所有存在的 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" }
    }
}

方法二:

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" }}

query exists doesn't work same way with nested type field that's why it doesn't find anything while trying delete on nested type field

根据参考资料: 它应该对我有用,但它对我不起作用。

Elasticsearch 有一个概念 Nested Datatype, and for that only 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"
  }}
}

希望对您有所帮助!