有时需要统计一段时间内,订单的总金额。类似于sql的sum,针对某一字段求和。这就涉及到es的聚合查询,来看看用spring-data-elasticSearch怎么写:

  1.  
    QueryBuilder queryBuilder = QueryBuilders.boolQuery()
  2.  
    .must(QueryBuilders.rangeQuery("orderTime").gte(from).lte(to));
  3.  
    // 聚合查询。goodsSales是要统计的字段,sum_sales是自定义的别名
  4.  
    SumAggregationBuilder sumBuilder = AggregationBuilders.sum("sum_sales").field("goodsSales");
  5.  
     
  6.  
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
  7.  
    .withQuery(queryBuilder)
  8.  
    .addAggregation(sumBuilder)
  9.  
    .build();
  10.  
     
  11.  
    double saleAmount = elasticsearchTemplate.query(searchQuery, response -> {
  12.  
    InternalSum sum = (InternalSum)response.getAggregations().asList().get(0);
  13.  
    return sum.getValue();
  14.  
    });

对应es查询语句:

  1.  
    {
  2.  
    "query": {
  3.  
    "bool": {
  4.  
    "must": [
  5.  
    {
  6.  
    "range": {
  7.  
    "orderTime": {
  8.  
    "gte": 20180313,
  9.  
    "lte": 20180314
  10.  
    }
  11.  
    }
  12.  
    },
  13.  
    {
  14.  
    "match": {
  15.  
    "skuNo": "888"
  16.  
    }
  17.  
    }
  18.  
    ]
  19.  
    }
  20.  
    },
  21.  
    "aggs": {
  22.  
    "sum_value": {
  23.  
    "sum_sales": {
  24.  
    "field": "goodsSales"
  25.  
    }
  26.  
    }
  27.  
    }
  28.  
    }

以下还有一些常用聚合查询(参考http://blog.csdn.net/u010454030/article/details/63266035):

    1.  
      (1)统计某个字段的数量
    2.  
      ValueCountBuilder vcb= AggregationBuilders.count("count_uid").field("uid");
    3.  
      (2)去重统计某个字段的数量(有少量误差)
    4.  
      CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");
    5.  
      (3)聚合过滤
    6.  
      FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));
    7.  
      (4)按某个字段分组
    8.  
      TermsBuilder tb= AggregationBuilders.terms("group_name").field("name");
    9.  
      (5)求和
    10.  
      SumBuilder sumBuilder= AggregationBuilders.sum("sum_price").field("price");
    11.  
      (6)求平均
    12.  
      AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");
    13.  
      (7)求最大值
    14.  
      MaxBuilder mb= AggregationBuilders.max("max_price").field("price");
    15.  
      (8)求最小值
    16.  
      MinBuilder min= AggregationBuilders.min("min_price").field("price");
    17.  
      (9)按日期间隔分组
    18.  
      DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");
    19.  
      (10)获取聚合里面的结果
    20.  
      TopHitsBuilder thb= AggregationBuilders.topHits("top_result");
    21.  
      (11)嵌套的聚合
    22.  
      NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
    23.  
      (12)反转嵌套
    24.  
      AggregationBuilders.reverseNested("res_negsted").path("kps ");

最新文章

  1. 同步机制 note
  2. 1代 angularjs ember vue 比较
  3. Yann LeCun, Geoffrey E. Hinton, and Yoshua Bengio
  4. sleep函数
  5. IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力
  6. UIButton之Block回调
  7. jpGraph的应用及基本安装配置 BY 命运
  8. shell date格式化输出
  9. OAuth在WebApi
  10. Linux - 简明Shell编程09 - 重定向(Redirection)
  11. Git创建本地分支并推送到远程github仓库
  12. java,javascript中的url编码
  13. 关于MySQL 8.0的几个重点【转】
  14. Linux 下安装 Mongodb
  15. Java中的字段和属性
  16. day 21 模块 和 包
  17. 16.监听器-基础.md
  18. SFTP服务器搭建
  19. 详解权限管理(RBAC)的实现方法
  20. python中 .write 无法向文件写入内容

热门文章

  1. 便捷的方式在手机上查看Unity3D的Console Log(调试信息 日志)
  2. 【PAT】B1012 数字分类
  3. JavaScript -- 时光流逝(四):js中的 Math 对象的属性和方法
  4. 【转载】failed to initialize nvml driver/library version mismatch ubuntu
  5. 基于centOS7:新手篇→nginx安装
  6. C语言 排序算法总结
  7. UVA11491-Erasing ans Winning(贪心)
  8. 【js】JS实现的base64加密、md5加密及sha1加密详解
  9. 006_Python 异常处理
  10. Python实现机器人聊天