关于使用RestHighLevelClient查询时间戳timestamp数据总数不对问题
关于使用RestHighLevelClient查询时间戳timestamp数据总数不对问题
·
在使用RestHighLevelClient查询时间戳timestamp时,timestamp时UTC格式,于中国时间有时差,所以需要使用timeZone来做转换。
Date begin = new Date();
Date end = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//查询timestamp时间戳,使用timeZone自动转UTC时间
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("@timestamp")
.gte(sdf.format(begin))
.lt(sdf.format(end)).format("yyyy-MM-dd HH:mm:ss.SSS").timeZone("+08:00");
我们都知道elasticsiearch不是实时性的,数据在入elasticsearch之后经过refresh_interval时间后才能被检索到,这就导致我们需要等待数据刷新后才能被检索。当我们使用时间戳timestamp做查询条件的时候,我们就会想当然的认为是数据没有被刷新所以才查询不到。经过笔者测试发现,即使数据已经刷新完成,使用上面代码也一出现数据对不上问题。后来经过改造不适用timeZone问题解决。
Date begin = DateUtile.date8(new Date());
Date end = DateUtile.date8(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//查询timestamp时间戳
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("@timestamp")
.gte(sdf.format(begin))
.lt(sdf.format(end)).format("yyyy-MM-dd HH:mm:ss.SSS");
public class DateUtil {
public static final long TIMEZONE = 8*60*60*1000;
//手动减少8小时
public static Date date8(Date date){
return new Date(date.getTime()-TIMEZONE);
}
}
如果对你有帮助,请点赞关注
更多推荐
已为社区贡献1条内容
所有评论(0)