微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ElasticSearch分组后根据sum值排序

1、 ES聚合分析是什么?

聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。

一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合   metric

而关系型数据库中除了有聚合函数外,还可以查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶桶聚合 bucketing

下面以es5.6.13为例讲下具体怎么使用聚合函数AggregationBuilder:

2、QueryBuilder和AggregationBuilder区别:

QueryBuilder:构建并组装查询条件(相当于sql中where条件内容

AggregationBuilder:组装聚合函数,求最大、最小、和、平均值、对数据group by,根据聚合后的值排序

3、如何加到搜索请求中(Transport连接方式):

SearchResponse sr = node.client().prepareSearch()
        .setQuery( /* your query */ )
        .addAggregation( /* add an aggregation */ )
        .execute().actionGet();

4、sql对应讲解:

SELECT
    h_name hName,
    sum( DATE_SUB( CURDATE( ),INTERVAL 7 DAY ) <= date( create_time ) ) AS userSum
FROM
    k_kNowledge_history_search 
WHERE
    tenant_id =? 
    AND u_id IN ( ) 
GROUP BY
    h_name 
ORDER BY   userSum  DESC 
    LIMIT 0,50

省略组装查询条件......

开始组装聚合函数sql中是在根据hName分组后求一定条件下的数量和】

先列出求和函数

String  afterTime = df.format(CommTool.getAfterDate(new Date(), -7));
//filter是求和条件,要求近七天的数量和
AggregationBuilder agg1=AggregationBuilders.filter("filter1",QueryBuilders.rangeQuery("createTime").gt(afterTime)).subAggregation(AggregationBuilders.sum("userSum").field("num"));

/*也有简单的求和函数,只根据num求和即可
AggregationBuilders.sum("userSum").field("num")*/

求和函数拼接到group by 操作上:

AggregationBuilders.terms("aggName").size(2147483647).order(Terms.Order.aggregation("filter1",false)).field("hName.keyword").subAggregation(agg1);

//size:聚合的数量,5.x版本之前设置为0即可查询全部,5.x之后可设置为int的最大值保证可返回全部数据
//order:指定排序字段,认根据分组的字段排序,可以按sum求和后的值进行排序
//field:指定聚合的字段(字段需为keyword类型)
//subAggregation:为聚合函数添加子聚合

5、对应的DSL:

  "aggregations" : {
    "aggName" : {      //自定义名称
      "terms" : {
        "field" : "hName.keyword",
        "size" : 2147483647,
        "min_doc_count" : 1,
        "shard_min_doc_count" : 0,
        "show_term_doc_count_error" : false,
        "order" : [
          {
            "filter1" : "desc"
          }
        ]
      },
      "aggregations" : {
        "filter1" : {         //自定义名称
          "filter" : {
            "range" : {
              "createTime" : {
                "from" : "2021-07-30 09:28:20",
                "to" : null,
                "include_lower" : false,
                "include_upper" : true,
                "boost" : 1.0
              }
            }
          },
          "aggregations" : {
            "userSum" : {
              "sum" : {
                "field" : "num"
              }
            }
          }
        },
        "createTime" : {    //每个hName对应最大创建时间
          "max" : {
            "field" : "createTime"
          }
        }
      }
    }
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐