Elasticsearch 日期存储 Java API
存储的时候,我采用的方式是直接存储Date 类型。上部分代码。
//Map集合for (Map<String,Object> source : jsonArray) {//直接IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type,id)//直接set.setSource(source);//TTLif(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 是否只返回当天数据* @return 分页对象*/public static Pagination<HistoryBo> findByHistoryPage(String key, Integer pageSize, Integer pageNo,boolean isToday) {Pagination<HistoryBo> page = new Pagination<HistoryBo>();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();//totalint total = (int)hits.getTotalHits();page.setTotalCount(total);List<HistoryBo> list = new ArrayList<HistoryBo>(total);for (SearchHit searchHit : hits) {Map<String, Object> 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, "转换为<HistoryBo>失败,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
有时间可以看看:http://www.sojson.com/blog/149.html
来源:oschina
链接:https://my.oschina.net/u/866802/blog/1834130