问题描述
我在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查询(本机,字符串或条件)。