java - 删除 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列表
解决方案
好吧,通过查询删除是要走的路。
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();
自版本 3.2 起,这被 Spring-data-elasticsearch 标记为支持。
例如,您可以使用查询派生:
除了查询方法之外,还可以使用计数和删除查询的查询派生。
在附录 C 中,您可以看到这IsLessThan
是一个查询派生关键字,这意味着应该开箱即用地支持这些方面的内容:
interface YourRepository extends CrudRepository<User, Long> {
long deleteByExpirationDateIsLessThan(long timestamp);
}
通过使用查询派生,您让 spring 执行实现(手指交叉,它将做“正确的事情”)。
但是你也可以使用 a ElasticsearchRestTemplate#delete
(如果你使用的是旧的ElasticsearchTemplate
,这也是一样的)。
这允许您传入任何 spring-data 查询(本机、字符串或条件)。
推荐阅读
- nginx - 如果请求从一个应用程序传递到另一个应用程序,如何获取真实的客户端 IP 地址?
- mysql - MYSQL HAVING 和 WHERE 条件
- jenkins - Jenkins 声明性管道动态选择参数在首次构建后未更新
- c# - Android DataBinding - 如何绑定 ViewGroup 的属性
- javascript - Bookmarlet:从 URL 末尾获取数字并将其放入新 URL?
- television - 获取 LG webOS TV 上所有已安装应用的所有应用 ID
- discord.js - 从发送给机器人的 DM 消息中获取用户 ID
- excel - 将字符串从 Excel 单元格粘贴到 Outlook 邮件时保留回车符
- linux - Objdump 中的 -s(或 --full-contents)标志有什么作用?
- angular - 如何在页面重新加载时关闭垫子扩展面板