仅删除符合我的条件的所有文档中的字段
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 是,每个嵌套对象都被索引为一个隐藏的单独文档 因此您进行的查询使用,不起作用。
通过嵌套文档的查询脚本更新以删除字段
这适用于您只想删除 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"
}}
}
希望对您有所帮助!
要从所有文档中删除任何具有值的字段而不从 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 是,每个嵌套对象都被索引为一个隐藏的单独文档 因此您进行的查询使用,不起作用。
通过嵌套文档的查询脚本更新以删除字段
这适用于您只想删除 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"
}}
}
希望对您有所帮助!