Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API

Elasticsearch 日期存储 Java API

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

 
  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 类型的毫秒值,怎么存储怎么查询。

Elasticsearch 日期查询 Java API

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

 
  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类型查询

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

 
  1. //查询大于一个给定的时间
  2. QueryBuilders.rangeQuery("date").gt(date);

查询一个区间时间

 
  1. //查询区间时间
  2. QueryBuilders.rangeQuery("date").lt(beginDate).gt(endDate);

查询小于给定的时间

 
  1. //查询小于给定时间的数据
  2. QueryBuilders.rangeQuery("date").lt(beginDate);

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

查询小于给定时间的数据

 
  1. //查询小于给定时间的数据
  2. QueryBuilders.rangeQuery("date").format("yyyyMMdd").lt("20170505");

查询区间时间

 
  1. //查询区间时间
  2. srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gt("20170505").lt("20170530"));

查询等于给定时间

 
  1. //查询等于给定时间
  2. 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 

转载于:https://my.oschina.net/xiaominmin/blog/1834130

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 聚合查询(Aggregation)是一种用于对数据进行多维度分析的功能。聚合查询可以用于分析数据的分布情况、计算数据的统计信息、生成图表等。在 Elasticsearch 中,聚合查询是通过使用特定的聚合器(Aggregator)来完成的。 Java 中使用 Elasticsearch 聚合查询需要使用 Elasticsearch Java API。首先需要创建一个 SearchRequest 对象,并设置需要查询的索引和查询条件。然后创建一个 AggregationBuilder 对象,用于定义聚合查询的规则和参数。最后将 AggregationBuilder 对象添加到 SearchRequest 中,执行查询操作。 以下是一个简单的 Java 代码示例,用于查询某个索引下的数据,并按照某个字段进行分组聚合查询: ``` SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group_by_field").field("field_name"); searchSourceBuilder.aggregation(aggregationBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); Terms terms = searchResponse.getAggregations().get("group_by_field"); for (Terms.Bucket bucket : terms.getBuckets()) { String key = bucket.getKeyAsString(); long count = bucket.getDocCount(); System.out.println("key: " + key + ", count: " + count); } ``` 在上面的代码中,首先创建了一个 SearchRequest 对象,设置需要查询的索引和查询条件。然后创建了一个 TermsAggregationBuilder 对象,用于按照某个字段进行分组聚合查询。最后将 TermsAggregationBuilder 对象添加到 SearchRequest 中,执行查询操作。 查询结果会返回一个 Terms 对象,其中包含了分组聚合查询的结果。可以使用 Terms 对象的 getBuckets() 方法获取分组聚合查询的结果列表。每个分组聚合查询结果由一个 Terms.Bucket 对象表示,其中包含了分组聚合查询的键值和文档数量等信息。 以上是简单的聚合查询示例,Elasticsearch 聚合查询功能非常强大,支持多种聚合器和聚合规则,可以根据具体需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值