es查询时间long转date_Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API

本文详细介绍了如何在Elasticsearch中使用Java API进行日期查询,包括大于、小于、区间等查询方式,并提供了具体的代码示例,强调了日期格式化和存储类型的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch 日期存储 Java API

存储的时候,我采用的方式是直接存储Date 类型。上部分代码。

//Map集合

for (Map source : jsonArray) {

//直接

IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type,id)

//直接set

.setSource(source);

//TTL

if(null != timer && timer.length > 0){

lrb.setTTL(timer[0]);

}

bulkRequest.add(lrb);

}

如果有日期查询,大量的日期查询,建议想清楚,是以String ,Date ,还是Long 类型的毫秒值,怎么存储怎么查询。

Elasticsearch 日期查询 Java API

先来一个完整的业务代码。里面包含时间查询,其实业务很简单,我就需要当天的数据。

/**

* 浏览记录,分页查询

* @param key 用户key

* @param pageSize size

* @param pageNo no

* @param isToday 是否只返回当天数据

*/

public static Pagination findByHistoryPage(String key, Integer pageSize, Integer pageNo,boolean isToday) {

Pagination page = new Pagination();

pageNo = null==pageNo?1:pageNo;

page.setPageNo(pageNo);

page.setPageSize(pageSize);

Client client = ESTools.client;

SearchRequestBuilder srb = client.prepareSearch(BaseMapping.HISTORY_INDEX);

//根据用户key查询

srb.setQuery(QueryBuilders.termQuery("key",key) );

/*******************************|日期查询代码 start|***********************************/

//是否只查询当天

if(isToday){

//取到当天凌晨时间

Calendar cal = Calendar.getInstance();

cal.set(Calendar.HOUR_OF_DAY,0);

cal.set(Calendar.MINUTE, 0);

cal.set(Calendar.SECOND, 0);

cal.add(Calendar.DATE,0);

//查询今天的的数据,查询createDate 字段,大于当天0点的时间

srb.setQuery(QueryBuilders.rangeQuery("createDate").gt(cal.getTime()));

}

/*******************************|日期查询代码 end|***********************************/

/**设置返回version,默认是false**/

srb.setVersion(Boolean.TRUE);

srb.addSort("createDate", SortOrder.DESC);

srb.setFrom((pageNo - 1) * pageSize).setSize(pageSize);

//srb.setExplain(Boolean.TRUE)

//get() == execute().actionGet(); 新版本把execute().actionGet() 封装成get().

SearchResponse response = srb.get();

SearchHits hits = response.getHits();

//total

int total = (int)hits.getTotalHits();

page.setTotalCount(total);

List list = new ArrayList(total);

for (SearchHit searchHit : hits) {

Map source = searchHit.getSource();

String id = searchHit.getId();

//获取version,作为count返回

long v = searchHit.getVersion();

//先创建,防止catch后 null.toString()异常。

Gson gson = new Gson();

String json = "";

try {

json = gson.toJson(source);

HistoryBo entity = gson.fromJson(gson.toJson(source), HistoryBo.class);

entity.setCount(v);

entity.setKey(id);//把ID取出来,给key赋值,方便删除操作

list.add(entity);

} catch (Exception e) {

LoggerUtils.fmtError(SelectManager.class, e, "转换为失败,Data[%s]", json);

continue;

}

}

page.setList(list);

return page;

}

Elasticsearch 时间查询Java API说明

按Date类型查询

查询大于一个给定的时间。

//查询大于一个给定的时间

QueryBuilders.rangeQuery("date").gt(date);

查询一个区间时间

//查询区间时间

QueryBuilders.rangeQuery("date").lt(beginDate).gt(endDate);

查询小于给定的时间

//查询小于给定时间的数据

QueryBuilders.rangeQuery("date").lt(beginDate);

Date 以格式化字符串方式查询。

查询小于给定时间的数据

//查询小于给定时间的数据

QueryBuilders.rangeQuery("date").format("yyyyMMdd").lt("20170505");

查询区间时间

//查询区间时间

srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gt("20170505").lt("20170530"));

查询等于给定时间

//查询等于给定时间

srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gte("20170505"));

小插曲:这里我建议格式化话的时候,中间别带“-” ,只是建议。因为我测试把“20170505” 写成 int 类型的 20170505  查询是OK 的。

有问题加群继续沟通。另外上次记得深入了一次Elasticsearch date 类型存储的博客。

另外存储Date,请认准java.util.Date  , 切勿用 java.sql.Date

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值