存儲的時候,我採用的方式是直接存儲Date
類型。上部分代碼。html
//Map集合
for (Map<String,Object> 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
類型的毫秒值,怎麼存儲怎麼查詢。java
先來一個完整的業務代碼。裏面包含時間查詢,其實業務很簡單,我就須要當天的數據。sql
/**
* 瀏覽記錄,分頁查詢
* @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();
//total
int 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;
}
查詢大於一個給定的時間。json
//查詢大於一個給定的時間
QueryBuilders.rangeQuery("date").gt(date);
查詢一個區間時間app
//查詢區間時間
QueryBuilders.rangeQuery("date").lt(beginDate).gt(endDate);
查詢小於給定的時間測試
//查詢小於給定時間的數據
QueryBuilders.rangeQuery("date").lt(beginDate);
查詢小於給定時間的數據ui
//查詢小於給定時間的數據
QueryBuilders.rangeQuery("date").format("yyyyMMdd").lt("20170505");
查詢區間時間spa
//查詢區間時間
srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gt("20170505").lt("20170530"));
查詢等於給定時間.net
//查詢等於給定時間
srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gte("20170505"));
小插曲:這裏我建議格式化話的時候,中間別帶「-」
,只是建議。由於我測試把「20170505」
寫成 int
類型的 20170505
查詢是OK
的。code
有問題加羣繼續溝通。另外上次記得深刻了一次Elasticsearch date
類型存儲的博客。
另外存儲Date,請認準java.util.Date
, 切勿用 java.sql.Date