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

问题描述

我在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"
   }
}

我想在Springdata Elasticsearch中使用QueryBuilder删除所有 id 列表,这些列表的 expirationDate 比今天小。

解决方法

嗯,delete by query是必经之路。

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

java client documentation表示您可以通过以下方式建立请求:

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

这被标记为supported by Spring-data-elasticsearch since version 3.2

例如,您可以使用query derivation

除了查询方法外,还可以使用计数和删除查询的查询推导。

在附录C中,您可以看到IsLessThan是一个查询派生关键字,这意味着应该开箱即用地支持以下内容:

interface YourRepository extends CrudRepository<User,Long> {
  long deleteByExpirationDateIsLessThan(long timestamp);
}

通过使用查询派生,您可以让spring做实现(手指交叉说它将做“正确的事情”)。

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

这允许您传入任何spring-data查询(本机,字符串或条件)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...