Elasticsearch 日期查詢詳解,Elasticsearch Date 查詢Java API

Elasticsearch 日期存儲 Java API

存儲的時候,我採用的方式是直接存儲Date 類型。上部分代碼。html

 
  1. //Map集合
  2. for (Map<String,Object> source : jsonArray) {
  3. //直接
  4. IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type,id)
  5. //直接set
  6. .setSource(source);
  7. //TTL
  8. if(null != timer && timer.length > 0){
  9. lrb.setTTL(timer[0]);
  10. }
  11. bulkRequest.add(lrb);
  12. }

若是有日期查詢,大量的日期查詢,建議想清楚,是以String ,Date ,仍是Long 類型的毫秒值,怎麼存儲怎麼查詢。java

Elasticsearch 日期查詢 Java API

先來一個完整的業務代碼。裏面包含時間查詢,其實業務很簡單,我就須要當天的數據。sql

 
  1. /**
  2. * 瀏覽記錄,分頁查詢
  3. * @param key 用戶key
  4. * @param pageSize size
  5. * @param pageNo no
  6. * @param isToday 是否只返回當天數據
  7. * @return 分頁對象
  8. */
  9. public static Pagination<HistoryBo> findByHistoryPage(String key, Integer pageSize, Integer pageNo,boolean isToday) {
  10. Pagination<HistoryBo> page = new Pagination<HistoryBo>();
  11. pageNo = null==pageNo?1:pageNo;
  12. page.setPageNo(pageNo);
  13. page.setPageSize(pageSize);
  14.  
  15.  
  16. Client client = ESTools.client;
  17. SearchRequestBuilder srb = client.prepareSearch(BaseMapping.HISTORY_INDEX);
  18. //根據用戶key查詢
  19. srb.setQuery(QueryBuilders.termQuery("key",key) );
  20.  
  21. /*******************************|日期查詢代碼 start|***********************************/
  22. //是否只查詢當天
  23. if(isToday){
  24. //取到當天凌晨時間
  25. Calendar cal = Calendar.getInstance();
  26. cal.set(Calendar.HOUR_OF_DAY,0);
  27. cal.set(Calendar.MINUTE, 0);
  28. cal.set(Calendar.SECOND, 0);
  29. cal.add(Calendar.DATE,0);
  30. //查詢今天的的數據,查詢createDate 字段,大於當天0點的時間
  31. srb.setQuery(QueryBuilders.rangeQuery("createDate").gt(cal.getTime()));
  32. }
  33. /*******************************|日期查詢代碼 end|***********************************/
  34.  
  35.  
  36. /**設置返回version,默認是false**/
  37. srb.setVersion(Boolean.TRUE);
  38. srb.addSort("createDate", SortOrder.DESC);
  39. srb.setFrom((pageNo - 1) * pageSize).setSize(pageSize);
  40. //srb.setExplain(Boolean.TRUE)
  41. //get() == execute().actionGet(); 新版本把execute().actionGet() 封裝成get().
  42. SearchResponse response = srb.get();
  43. SearchHits hits = response.getHits();
  44. //total
  45. int total = (int)hits.getTotalHits();
  46. page.setTotalCount(total);
  47.  
  48. List<HistoryBo> list = new ArrayList<HistoryBo>(total);
  49. for (SearchHit searchHit : hits) {
  50. Map<String, Object> source = searchHit.getSource();
  51. String id = searchHit.getId();
  52. //獲取version,做爲count返回
  53. long v = searchHit.getVersion();
  54. //先建立,防止catch後 null.toString()異常。
  55.  
  56. Gson gson = new Gson();
  57. String json = "";
  58. try {
  59. json = gson.toJson(source);
  60. HistoryBo entity = gson.fromJson(gson.toJson(source), HistoryBo.class);
  61. entity.setCount(v);
  62. entity.setKey(id);//把ID取出來,給key賦值,方便刪除操做
  63. list.add(entity);
  64. } catch (Exception e) {
  65. LoggerUtils.fmtError(SelectManager.class, e, "轉換爲<HistoryBo>失敗,Data[%s]", json);
  66. continue;
  67. }
  68. }
  69. page.setList(list);
  70. return page;
  71.  
  72. }

Elasticsearch 時間查詢Java API說明

按Date類型查詢

查詢大於一個給定的時間。json

 
  1. //查詢大於一個給定的時間
  2. QueryBuilders.rangeQuery("date").gt(date);

查詢一個區間時間app

 
  1. //查詢區間時間
  2. QueryBuilders.rangeQuery("date").lt(beginDate).gt(endDate);

查詢小於給定的時間測試

 
  1. //查詢小於給定時間的數據
  2. QueryBuilders.rangeQuery("date").lt(beginDate);

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

查詢小於給定時間的數據ui

 
  1. //查詢小於給定時間的數據
  2. QueryBuilders.rangeQuery("date").format("yyyyMMdd").lt("20170505");

查詢區間時間spa

 
  1. //查詢區間時間
  2. srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gt("20170505").lt("20170530"));

查詢等於給定時間.net

 
  1. //查詢等於給定時間
  2. srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gte("20170505"));

小插曲:這裏我建議格式化話的時候,中間別帶「-」 ,只是建議。由於我測試把「20170505」 寫成 int 類型的 20170505  查詢是OK 的。code

有問題加羣繼續溝通。另外上次記得深刻了一次Elasticsearch date 類型存儲的博客。

另外存儲Date,請認準java.util.Date  , 切勿用 java.sql.Date 

有時間能夠看看:http://www.sojson.com/blog/149.html 

相關文章
相關標籤/搜索