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

Cat*_*ina 6 java query-builder elasticsearch spring-boot spring-data-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"
   }
}
Run Code Online (Sandbox Code Playgroud)

我想在springdata Elasticsearch 中使用 QueryBuilder删除其到期日期小于今天的所有ID列表

GPI*_*GPI 7

好吧,按查询删除是要走的路。

POST /{your_index_name}/_delete_by_query
{
  "query": {
    "range": {
      "expirationDate": {
        "lt": "{your_timestamp}"
      }
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

Java客户端文件表示你可以建立一个要求是这样的:

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

这被标记为Spring-data-elasticsearch 自版本 3.2 支持

例如,您可以使用查询派生

除了查询方法,计数和删除查询的查询派生也是可用的。

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

interface YourRepository extends CrudRepository<User, Long> {
  long deleteByExpirationDateIsLessThan(long timestamp);
}
Run Code Online (Sandbox Code Playgroud)

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

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

这允许您传入任何弹簧数据查询(本机、字符串或条件)。