es delete_by_query
时间: 2023-12-01 08:02:54 浏览: 64
`es delete_by_query` 是 Elasticsearch 提供的一种删除文档的方式,可以根据指定的查询条件删除符合条件的文档。具体使用方法如下:
1. 使用 HTTP DELETE 请求访问 `http://localhost:9200/{index}/_delete_by_query`,其中 `{index}` 为要删除文档的索引名。
2. 在请求体中指定查询条件,例如:
```
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
```
上述查询条件表示删除所有 `title` 字段包含 "Elasticsearch" 的文档。
3. 发送请求,即可删除符合条件的文档。
需要注意的是,`es delete_by_query` 操作是一项危险的操作,因为它是永久性的。建议在执行该操作之前备份数据,以免误操作导致数据丢失。
相关问题
用JAVA写一个定时任务,定时清理es mtime 30天之前的数据 采用 delete_by_query
可以使用 Quartz 定时任务框架来实现,以下是一个简单的示例代码:
首先引入相关依赖:
```xml
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.0.0</version>
</dependency>
```
然后定义一个 Job 类来执行清理操作:
```java
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest;
import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
public class EsCleanJob implements Job {
private RestHighLevelClient esClient;
public EsCleanJob(RestHighLevelClient esClient) {
this.esClient = esClient;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("开始清理es数据...");
// 计算30天前的时间戳
LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30);
long timestamp = thirtyDaysAgo.toInstant(ZoneOffset.of("+8")).toEpochMilli();
// 构建 delete by query 请求
DeleteByQueryRequest request = new DeleteByQueryRequest("index_name");
request.setQuery(QueryBuilders.rangeQuery("mtime").lt(timestamp));
// 执行 delete by query 操作
try {
DeleteByQueryResponse response = esClient.deleteByQuery(request, RequestOptions.DEFAULT);
System.out.println("清理完成,删除 " + response.getDeleted() + " 条数据");
} catch (IOException e) {
throw new JobExecutionException("清理es数据失败", e);
}
}
}
```
最后在主函数中启动定时任务:
```java
import org.elasticsearch.client.RestHighLevelClient;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class EsCleanScheduler {
public static void main(String[] args) throws SchedulerException {
// 创建 es 客户端
RestHighLevelClient esClient = new RestHighLevelClient(/* es 配置 */);
// 创建 JobDetail 实例
JobDetail jobDetail = JobBuilder.newJob(EsCleanJob.class).withIdentity("esCleanJob").build();
// 创建 Trigger 实例
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("esCleanTrigger")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(86400)) // 每隔一天执行一次
.build();
// 创建 Scheduler 实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
```
这样就完成了定时清理 es 数据的任务。
delete-by-query和elasticsearch版本对应
在Elasticsearch中,delete-by-query是一种操作,用于根据特定的查询条件从索引中删除文档。然而,要注意的是,delete-by-query仅在特定的Elasticsearch版本中可用。
在早期的Elasticsearch版本中(例如5.x和6.x版本),delete-by-query插件是通过安装另外的插件来实现的。需要单独下载并安装delete-by-query插件,然后才能使用该功能。这意味着在这些版本中,官方的Elasticsearch发行版中并不包含delete-by-query功能。
然而,从Elasticsearch 7.0版本开始,delete-by-query被集成为Elasticsearch的核心功能,不再需要单独安装插件。这意味着从Elasticsearch的7.0版本及以后的版本中,delete-by-query已成为官方支持的操作,用户无需额外安装插件即可使用该功能。
因此,要使用delete-by-query功能,需要根据所使用的Elasticsearch版本进行判断。如果使用的是早期版本,如5.x或6.x,就需要下载并安装相应的delete-by-query插件。而如果使用的是7.0版本或之后的版本,delete-by-query已被纳入核心功能中,无需额外安装插件。
总之,delete-by-query功能的可用性与Elasticsearch版本密切相关,用户需要根据所使用的版本来确定是否需要安装插件或直接使用官方发行版。
阅读全文