PS→无奈:拥有梦想只是一种智力,实现梦想才是一种能力。

空闲之余就把先前做过的一个通过ElasticSearch的聚合来实现查询当月实际签到的天数记录一下,纯留下点记忆,大家勿喷

1.如果不了解elsticsearch聚合的概念可以自行网上查看一番,起码懂得概念以及使用方法。
我们的业务是需要查看某个人某个月的签到天数,不管一天签到多少次,只计算一次。根据签到天数计算获取的补贴数据入库。
elasticsearch依赖:

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>3.0.0.RELEASE</version>
</dependency>
补贴入库接口:
/*** @Author: Qzli* @Description: 补贴入库接口* @Date: Create by 2018/12/10 13:23* @return:*/@RequestMapping("/saveAllowance")public R saveAllowance(@RequestParam Map<String, Object> params){SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");String organizationName = String.valueOf(params.get("organizationName"));  //调用方传过来的学校名称  例:蘑菇丁体验学院String organizationCode = String.valueOf(params.get("organizationCode"));  //调用方传过来的学校code  例:88888String roleType = String.valueOf(params.get("roleType"));  //调用方传过来的角色  例:studentif(StringUtils.isEmpty(organizationName)){return R.error(SystemErrorCode.DATA_NOTHADE.getCode(),"学校名称不能为空");}if(StringUtils.isEmpty(organizationCode)){return R.error(SystemErrorCode.DATA_NOTHADE.getCode(),"学校CODE不能为空");}if(StringUtils.isEmpty(roleType)){return R.error(SystemErrorCode.DATA_NOTHADE.getCode(),"角色不能为空");}// 获取当前日期  例:2018-10Date now = new Date();Map<String, Integer> maps = DateUtils.getMonthInfo(now);  //获取当前月的工作日(不考虑节假日的情况下)Calendar cal = Calendar.getInstance();int year = cal.get(Calendar.YEAR);int month = cal.get(Calendar.MONTH) + 1;int days = maps.get("workDaysAmount");  //获取当前月的工作日(不考虑节假日的情况下)String dateTime = format.format(now);String sst = dateTime+"-01";SimpleDateFormat sDateFormat=new SimpleDateFormat(DateUtils.DATE_PATTERN);Date sdate = null;  //开始日期try {sdate = sDateFormat.parse(sst);} catch (ParseException e) {e.printStackTrace();}Date edate = DateUtils.addDateMonths(sdate,1);  //结束日期List<UserIndex> userIndexList = queryLikeUserInfo.searchStudentList(organizationName,organizationCode,roleType);//获取深职院的学生int count=0;int count1=0;boolean flag;for(int i = 0;i<userIndexList.size();i++){//循环获取学生GxyStudentAllowanceEntity gae = new GxyStudentAllowanceEntity();gae.setYear(BigDecimal.valueOf(year));  //年份gae.setMonth(BigDecimal.valueOf(month));//月份gae.setPfId(userIndexList.get(i).getPfid());//学生pfidgae.setSyncFlag(BigDecimal.valueOf(0));//同步标记gae.setStandardWorkingDay(BigDecimal.valueOf(days));// 标准工作日天数if (gae.getPfId()!=null){  //判断该学生的pfid是否为空//从es里获取签到天数(不排除周末以及是否上下班等等)int signCount = queryLikeUserInfo.querySign(gae.getPfId(),"practiceSign",DateUtils.formatTo(sdate),DateUtils.formatTo(edate),"1").intValue();// 从es里面获取计入补贴的实际工作天数int workCount = queryLikeUserInfo.querySign(gae.getPfId(),"practiceSign",DateUtils.formatTo(sdate),DateUtils.formatTo(edate),"2").intValue();if(workCount>days){  //判断实际工作天数是否大于正常工作日天数gae.setActualWorkingDay(BigDecimal.valueOf(days)); //实际工作日天数}else{gae.setActualWorkingDay(BigDecimal.valueOf(workCount));  //计入补贴的实际工作天数}gae.setSignCount(BigDecimal.valueOf(signCount));  //学生总共签到的天数(不排除周末以及是否上下班等等)int sum = 650*workCount;long allowance = Math.round((sum+0.0)/days);  //应发补贴算法gae.setAllowance(BigDecimal.valueOf(allowance)); //应发补贴}else{  // 为空的话就是未绑定用户 都默认设置为0gae.setSignCount(BigDecimal.valueOf(0));gae.setActualWorkingDay(BigDecimal.valueOf(0));gae.setAllowance(BigDecimal.valueOf(0));}// 根据年、月、学生pfid  验证数据库是否存在GxyStudentAllowanceEntity entity = gxyStudentAllowanceService.selectOne(new EntityWrapper<GxyStudentAllowanceEntity>().eq("YEAR",gae.getYear()).eq("MONTH",gae.getMonth()).eq("PF_ID",gae.getPfId()));if (entity!=null){flag = gxyStudentAllowanceService.update(gae,new EntityWrapper<GxyStudentAllowanceEntity>().eq("GXY_STUDENT_ALLOWANCE_ID",entity.getGxyStudentAllowanceId()));if(flag){count++;}}else{flag = gxyStudentAllowanceService.insert(gae);if(flag){count1++;}}}logger.info("更新:"+count+"条记录");logger.info("插入:"+count1+"条记录");return R.ok();}

从es里获取签到天数:
/*** @Author: Qzli* @Description: 根据用户id、类型(签到)、开始时间、结束时间 到es里面查询签到天数* @Date: Create by 2018/11/28 14:26* @param: 签到天数* @return:*/public Long querySign(String userId,String type,String startTime,String endTime,String flag) {// 测试一把  https://blog.csdn.net/qq_28988969/article/details/81565765AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("dayAgg")  //聚合名字.field("publishtime")       // 需要聚合分组的字段名称, 类型需要为date, 格式没有要求.dateHistogramInterval(DateHistogramInterval.DAY)     // 按什么时间段聚合, 这里是按月份, 可用的interval在上面给出.format("yyyy-MM-dd")   // 返回值格式化.minDocCount(0L);       // 为空的话则填充0,强制返回所有 buckets,即使 buckets 可能为空。
//                .extendedBounds(new ExtendedBounds("2018-10-01", "2018-11-01"));//为了得到全月数据,我们需要告诉 Elasticsearch 我们想要全部 buckets, 即便那些 buckets 可能落在最小日期 之前 或 最大日期 之后SearchRequestBuilder searchRequestBuilder = null;if("1".equals(flag)){  //1:计算总的签到天数(不排除周末以及是否上下班等等)searchRequestBuilder = elasticsearchTemplate.getClient().prepareSearch("article")  //索引名.setTypes("json")               //索引类型.setSize(0)                   // 不显示具体的内容.setQuery(boolQuery().must(QueryBuilders.matchPhraseQuery("pfid", userId))           //用户id.must(QueryBuilders.matchPhraseQuery("formtype", type))         //类型为签到.must(QueryBuilders.rangeQuery("orderbytime").from(startTime).to(endTime))).addAggregation(aggregationBuilder);}else{  //2:计算实际出勤天数searchRequestBuilder = elasticsearchTemplate.getClient().prepareSearch("article")  //索引名.setTypes("json")               //索引类型.setSize(0)                   // 不显示具体的内容.setQuery(boolQuery().must(QueryBuilders.matchPhraseQuery("pfid", userId))           //用户id.must(QueryBuilders.matchPhraseQuery("formtype", type))         //类型为签到.must(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("tagarray", "$mgonwork$"))//签到类型为上班.should(QueryBuilders.matchPhraseQuery("tagarray", "$mgoffwork$"))  //或者为下班mgoffwork.should(QueryBuilders.matchPhraseQuery("tagarray", "$mglegwork$")))  //或者为外勤mglegwork.must(QueryBuilders.matchPhraseQuery("tagarray", "$1$"))  //已确认的签到.must(QueryBuilders.rangeQuery("orderbytime").from(startTime).to(endTime))).addAggregation(aggregationBuilder);}SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();  //执行查询Aggregations aggs = searchResponse.getAggregations(); //聚合Histogram agg = aggs.get("dayAgg");  //获取聚合自定义名称long count = 0;  //计入补贴的签到天数for (Histogram.Bucket entry : agg.getBuckets()) {System.out.println(entry.getKeyAsString() + "签到" + entry.getDocCount() + "次");if (entry.getDocCount()>0){count++;}}return count;}

elasticsearch客户端连接代理插件:putty

代理说明:

127.0.0.1:9300 --> 114.215.66.118 --> 120.27.26.68:9300
最终在你代码本地使用127.0.0.1:9300这个地址来访问es
用es head就一样的配置9200
第一步  在《会话》中添加 114.215.66.118     端口: 22
第二步  在《通道》中添加 120.27.26.68:9300    120.27.26.68:9200
点击添加 
最后点打开  输入账号,密码就登录进来了。

然后本地就可以访问了,启动修改本地es地址 ;

es查看用的是es_site来查看(打开es_site——点击index.html):

以下数据是在测试服的一些测试数据:(查看es数据更为直观,也可以用条件查询来判断代码查询数据是否正确)

这个没有什么直观的效果。鄙人自己做个备忘录。望大神们勿喷

java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)相关推荐

  1. 几个java小问题代码(大神不喜勿喷)

    这里用到了 import java.util.*; (1)输入一个五位数判断是否是回文数? public class Yule{ public static void main(String []ar ...

  2. 7年java水平_7年Java开发(月薪37K)分享正确的自学路线,不喜勿喷

    7年Java开发(月薪37K)分享正确的自学路线,不喜勿喷 原创编程仔日常2020-10-13 10:18:21 趁着昨晚空闲和今早的时间,编辑这一篇帖子,写下当初我自学Java走的弯路,希望大家引以 ...

  3. java 7年_笃学私教:7年Java开发(月薪37K)分享正确的自学路线,不喜勿喷!

    原标题:笃学私教:7年Java开发(月薪37K)分享正确的自学路线,不喜勿喷! 趁着昨晚空闲和今早的时间,编辑这一篇帖子,写下当初我自学Java走的弯路,希望大家引以为戒,不要多走前人走过的弯路,浪费 ...

  4. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  5. Elasticsearch聚合查询案例分享

    为什么80%的码农都做不了架构师?>>>    Elasticsearch聚合查询案例分享 1.案例介绍 本文包含三个案例: 案例1:统计特定时间范围内每个应用的总访问量.访问成功数 ...

  6. Elasticsearch聚合查询多字段设置权重

    Elasticsearch聚合查询多字段设置权重 背景 环境说明 script设置权重 小结 背景 实际应用中,可能会需要为为doc文档中某个字段的某些特定的值设置权重,影响排序.es提供了比较灵活的 ...

  7. 外汇汇率接口 java_基于java的货币汇率接口调用代码实例

    基于java的货币汇率接口调用代码实例 基于JAVA 的货币汇率接口调用代码实例 代码描述:基于JAVA 的货币汇率接口调用代码实例 代码平台:聚合数据 import java.io.Buffered ...

  8. php聚合查询,php elasticsearch 聚合查询(Aggregation)

    Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景. 这里主要介绍PHP Elasticsearch 聚合查询的写法,如果不 ...

  9. java开发成语的过程_基于JAVA的成语词典接口调用代码实例

    基于JAVA的成语词典接口调用代码实例 接口描述:基于JA V A的成语词典接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...

最新文章

  1. Indigo | Indigo(Python)简介、安装与入门
  2. 观察者模式/ java实现附代码 /
  3. 重新认识mysql基本知识
  4. Web Storage中的sessionStorage和localStorage
  5. 使用php最容易犯的11个MySQL错误。
  6. mysql实现读写分离
  7. nextcloud+nginx+mysql,Ubuntu搭建Nginx-Nextcloud环境
  8. JEESZ分布式架构3--CentOs下安装MySQL(环境准备)
  9. 实现textbox输入时模糊查询
  10. Zabbix添加监控项及配置邮件报警
  11. 事务复制5: Transaction and Command
  12. matlab卡方拟合优度检验,卡方拟合优度检验在教学中的应用及Matlab实现_刘泽显...
  13. iPhone相机参数设置,苹果原相机也能拍出大片感
  14. 知名程序员云风辞职 意在重新思考未来
  15. Spring boot集成RabbitMQ(山东数漫江湖)
  16. 人机交互及用户体验、GUI思考
  17. 肖申克的救赎-救赎自己的心灵
  18. 说一说刚拿下BIRTV推荐的中国8K摄像机新品
  19. 解决elasticsearch里拒绝更新mapping设置的错误
  20. 交换两个变量的值的swap函数

热门文章

  1. java开发计划怎么写_【精编范文】从事java,下一工作阶段的工作计划以及业绩目标,怎么写-精选word文档 (16页)...
  2. 利用DW制作一个图文混排
  3. Git 忽略文件配置规则
  4. 数据库工程师常见面试题,懂了秋招拿10个offer!
  5. 福建高职单招计算机上机操作,福建高职单招计算机模拟试卷(二)
  6. 解决vue 提交日期格式数据,时间出现时区差的问题
  7. Spring Security+OAuth2认证服务之令牌管理源码分析
  8. Failed to connect to database. This release of the GeoDatabase is either invalid or out of date
  9. 软件评测师2018年真题详解
  10. 5大类CAD快捷键一览表!快速学会CAD不是问题!照单全收!