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

时间:2019-03-25 16:02:20

标签: elasticsearch elasticsearch-painless amazon-elasticsearch

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

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

索引:my_properties

字段:提要

类型:文本

供稿的示例值: feed: ["AB-1234"]

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

我的主要问题是我的字段类型是嵌套而不是文本/字符串

索引:my_properties

字段:feed_v2

类型:嵌套

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

方法1:

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,它应该对我有用,但是a惜对我不起作用。

1 个答案:

答案 0 :(得分:2)

Elasticsearch的概念为this workaround,为此只有Nested Datatype会有所帮助。基本上,您的存在查询将采用以下形式:

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

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

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

根据Nested Query,嵌套文档与普通文档的区别在于,每个嵌套对象都被索引为一个隐藏的单独文档,因此您要使用的查询不会工作。

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

这是用于您只想删除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"
  }}
}

希望这会有所帮助!