要从所有文档中删除具有值的任何字段而不从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惜对我不起作用。
答案 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,嵌套文档与普通文档的区别在于,每个嵌套对象都被索引为一个隐藏的单独文档,因此您要使用的查询不会工作。
这是用于您只想删除feed
即field_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"
}}
}
希望这会有所帮助!