在Elasticsearch中删除所有小于某个值的元素

6

我在Elasticsearch中保存了以下JSON数据:

   {
   "id":"1234",
   "expirationDate":"17343234234",
   "paths":"http:localhost:9090",
   "work":"software dev",
   "family":{
      "baba":"jams",
      "mother":"ela"
   }
},
{
   "id":"00021",
   "expirationDate":"0123234",
   "paths":"http:localhost:8080",
   "work":"software engi",
   "family":{
      "baba":"stev",
      "mother":"hela"
   }
}

我想使用Spring Data Elasticsearch中的QueryBuilder删除所有过期日期小于今天的列表。

是的,但是这背后的原因是什么? - Catalina
我只是好奇这个条件...所有在今天之前创建的项目,基本上意味着所有项目,对吧?因为未来不存在已创建的项目...还是存在吗? - Val
正是我想要得到的。 - Catalina
这里有一个适合你的解决方案:https://dev59.com/fJfga4cB1Zd3GeqPAsfx#37669582,可能需要一些调整,因为它是针对旧版本的,但其中解释了概念,即滚动搜索。 - Val
请问您能否将解决方案适配到我正在使用的 Elasticsearch 7.6 上,非常感激。 - Catalina
显示剩余11条评论
1个回答

9

好的,按查询条件删除是正确的方法。

POST /{your_index_name}/_delete_by_query
{
  "query": {
    "range": {
      "expirationDate": {
        "lt": "{your_timestamp}"
      }
    }
  } 
}

Java客户端文档表明您可以以下列方式构建请求:

BulkByScrollResponse response =
  new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
    .filter(QueryBuilders.matchQuery("gender", "male")) 
    .source("persons")                                  
    .get();                                             
long deleted = response.getDeleted();

这被标记为自 Spring-data-elasticsearch 3.2 版本起支持
例如,您可以使用查询派生

除了查询方法之外,还提供了计数和删除查询的查询派生。

在附录 C 中,您可以看到IsLessThan是一个查询派生关键字,这意味着应该开箱即用地支持类似以下内容:
interface YourRepository extends CrudRepository<User, Long> {
  long deleteByExpirationDateIsLessThan(long timestamp);
}

通过使用查询派生,您让Spring进行实现(希望它会做“正确的事情”)。

但是,您也可以使用 ElasticsearchRestTemplate#delete(如果您使用较旧的ElasticsearchTemplate,则效果相同)。

这使您可以传递任何spring-data查询(本机、字符串或条件)。


但是如何使用 QueryBuilder 或类似的 API 创建支持此查询的函数?或者在 SpringBoot 中使用 DeleteRequestBuilder? - Catalina
我已经添加了细节,但实际上,这只是标准的Spring数据/Spring es东西。 - GPI
我有最后一个问题,请问是否有任何方法可以将所有的expirationDate更新为当前时间?如果expirationDate小于当前时间,则更新为今天的时间。请帮忙。 - Catalina
有这种功能,但是elasticsearch并没有针对此进行优化,因此成本非常高昂(基本上需要重建整个索引)。但这是另一个问题,请单独提问。 - GPI
请帮我: https://stackoverflow.com/questions/64771780/updating-elasticsearch-entities-with-bulk-without-id-parameters - Catalina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接