【发布时间】:2021-02-25 07:00:53
【问题描述】:
我是 Elasticsearch 的新手,并尝试使用 _delete_by_query API 定期删除文档(我非常感谢我可能应该使用基于时间的索引来简化此操作,并将更新索引在适当的时候构建结构,但现在我需要让它工作)。
我的索引包含名为 ServiceName、消息和时间戳(以及其他)的字段,我的要求非常简单。我想删除 ServiceName 等于特定值 (myService) 的文档,消息不等于两个特定值中的任何一个(Starting* 和 Finished*,因为我想保留任何跟踪历史记录中的第一条和最后一条日志消息),以及文件已超过 1 天。我正在使用带有以下负载的 _delete_by_query 端点:
{
"query": {
"bool": {
"must": [],
"filter": [{
"match_all": {}
},
{
"match_phrase": {
"ServiceName": {
"query": "myService"
}
}
},
{
"range": {
"@timestamp": {
"lte": "now-1d"
}
}
}
],
"should": [],
"must_not": [{
"bool": {
"should": [{
"match_phrase": {
"message": "Starting*"
}
},
{
"match_phrase": {
"message": "Finished*"
}
}
],
"minimum_should_match": 1
}
}]
}
}
}
当我使用 _search API 运行查询时,它会返回我希望被删除的数据,但是当我向 _delete_by_query 发出相同的查询时,它搜索结果中未返回的已删除文档。我正在使用 AWS Elasticsearch 服务。任何人都可以告诉我哪里出错了或者这应该工作吗?我最初认为它可能是 minimum_should_match 属性,但文档似乎表明这在这种情况下无关紧要
【问题讨论】:
-
...it deleted documents that were returned in the search results这是您所期望的对吗? -
哈 - 错字了。它删除了搜索结果未返回的文档,这是我应该说的。将编辑
-
好吧,这样更合乎逻辑 ;-) 不过我觉得这很令人惊讶...搜索查询得到多少结果?有多少是被同一个查询实际删除的?
-
嗯,也许我真的做错了什么。我会再试一次,因为我也很惊讶。随着时间的推移,我们正在谈论 2000 万份文档
-
感谢大家的 cmets - 我已经重新设计了索引策略以使用基于日期的索引,因此清除旧数据现在是删除索引的简单案例
标签: amazon-web-services elasticsearch amazon-elasticsearch