restTemplate.postForObject() 方法本质上是将对象放入HttpEntity中,然后将对象POST给一个url。
当我想根据时间范围批量删除一些es中的数据,用到了_delete_by_query的方法,在kibana上面写好测试得没问题了,然后我想把kibana上面整个语句直接发送到es上面。
这是我在kibana上面写的
POST center_data/_delete_by_query
{
"query": {
"bool":{
"must":{
"range": {
"RECORDTIME": {
"gte": "2020-06-29 01:00:00",
"lte": "2020-06-29 01:30:00"
}
}
}
}
}
}
方法测试已经没问题
下面是Java中的操作
public ResultEntity deleteByTime(String url, String name,String starttime,String endtime){
// boolean returnResult = false;
String result ="";
// String url = EsHttpUrl+"/center_data/_delete_by_query";
try {
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
if (!"111".equals(EsUserPwd)) {
headers.add("Authorization", "Basic " + Base64.getBase64(EsUserPwd));
}
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
RestTemplate restTemplate = new RestTemplate();
String body = "{\n" +
"\"query\": {\n" +
" \"bool\":{\n" +
" \"must\":{\n" +
" \"range\": {\n" +
" \""+name+"\": {\n" + //RECORDTIME
" \"gte\": \""+starttime+"\",\n" + //2020-06-29 00:00:00
" \"lte\": \""+endtime+"\"\n" + //2020-06-29 01:00:00
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }";
HttpEntity<String> formEntity = new HttpEntity<String>(body, headers);
LOGGER.info("formEntity:::"+formEntity);
result=restTemplate.postForObject(url, formEntity, String.class);
// returnResult = true;
LOGGER.info("result::::::::::::::::::::::::"+result);
LOGGER.info("删除完成");
}catch (Exception e){
// returnResult=false;
LOGGER.info("eee"+e);
LOGGER.error("删除失败,删除时间段:"+starttime+"--"+endtime);
}
return new ResultEntity(result);
}
需要注意的点:
1. url是需要写整个,就像kibana里面一样,比如这样:
String url = EsHttpUrl+"/center_data/_delete_by_query";
2. 在把kibana里面的请求体复制的时候要带着大括号复制![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/638388de98ccf8b304064e616f4be4d7.png)
这个图片里面标记的这一组大括号就不能少,不然会报400。