Elasticsearch教程(5) 指标聚合 SQL DSL JavaAPI

1 准备数据

参考上一篇博客在kibana里造好数据
数据结果如下:
在这里插入图片描述

2 AVG(平均值)

2.1 不带where条件求平均

2.1.1 SQL描述

#=======求平均值=======
POST /_xpack/sql?format=txt
{
    "query": "SELECT AVG(level) AS avg_level FROM dept" 
}

在这里插入图片描述

2.1.2 DSL描述

POST /dept/_doc/_search?size=0
{
  "aggs":{
    "avg_level": {
      "avg":{
        "field": "level"
      }
    }
  }
}

在这里插入图片描述

2.2 带where条件求平均

2.2.1 SQL描述

POST /_xpack/sql?format=txt
{
    "query": "SELECT AVG(level) AS avg_level FROM dept WHERE parentId = 3" 
}

2.2.2 DSL描述

POST /dept/_doc/_search
{
  "size":0,
  "query":{
      "term":{
        "parentId.keyword": "3"
      }
  },
  "aggs":{
    "avg_level": {
      "avg":{
        "field": "level"
      }
    }
  }
}

在这里插入图片描述

2.2.3 Java API 描述

public static Double getAvg(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
    getClient();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    searchSourceBuilder.size(0);
    
    AvgAggregationBuilder aggregation  = AggregationBuilders.avg("agg").field(field);
    searchSourceBuilder.aggregation(aggregation);
    
    SearchRequest searchRequest = new SearchRequest(indexs).types(type);
    searchRequest.source(searchSourceBuilder);
    
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    Avg agg = searchResponse.getAggregations().get("agg");
    return agg.getValue();
}

3 MAX(最大值)

3.1 SQL描述

POST /_xpack/sql?format=txt
{
    "query": "SELECT MAX(level) AS max_level FROM dept" 
}

3.2 DSL描述

POST dept/_doc/_search?size=0
{
  "aggs": {
    "max_level": {
      "max": {
        "field": "level"
      }
    }
  }
}

3.3 Java API 描述

public static Double getMax(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
    getClient();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    searchSourceBuilder.size(0);
    
    AggregationBuilder aggregationBuilder = AggregationBuilders.max("agg").field(field);
    searchSourceBuilder.aggregation(aggregationBuilder);
    
    SearchRequest searchRequest = new SearchRequest(indexs).types(type);
    searchRequest.source(searchSourceBuilder);
    
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    Max agg = searchResponse.getAggregations().get("agg");
    return agg.getValue();
}

4 MIN(最小值)

4.1 SQL描述

POST /_xpack/sql?format=txt
{
    "query": "SELECT MIN(level) AS min_level FROM dept" 
}

4.2 DSL描述

POST dept/_doc/_search?size=0
{
  "aggs": {
    "min_level": {
      "min": {
        "field": "level"
      }
    }
  }
}

4.3 Java API 描述

public static Double getMin(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
    getClient();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    searchSourceBuilder.size(0);
    
    MinAggregationBuilder aggregation = AggregationBuilders.min("agg").field(field);
    searchSourceBuilder.aggregation(aggregation);
    
    SearchRequest searchRequest = new SearchRequest(indexs).types(type);
    searchRequest.source(searchSourceBuilder);
    
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    Min agg = searchResponse.getAggregations().get("agg");
    return agg.getValue();
}

5 SUM(求和)

5.1 SQL描述

POST /_xpack/sql?format=txt
{
    "query": "SELECT SUM(level) AS sum_level FROM dept" 
}

5.2 DSL描述

POST dept/_doc/_search?size=0
{
  "aggs": {
    "sum_level": {
      "sum": {
        "field": "level"
      }
    }
  }
}

5.3 Java API 描述

 public static Double getSum(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
     getClient();
     SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
     searchSourceBuilder.query(queryBuilder);
     searchSourceBuilder.size(0);
     
     SumAggregationBuilder aggregation = AggregationBuilders.sum("agg").field(field);
     searchSourceBuilder.aggregation(aggregation);
     
     SearchRequest searchRequest = new SearchRequest(indexs).types(type);
     searchRequest.source(searchSourceBuilder);
     
     SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
     Sum agg = searchResponse.getAggregations().get("agg");
     return agg.getValue();
 }

6 COUNT(个数)

6.1 SQL描述

6.1.1 COUNT(*)

COUNT(*),包括null和丢失的字段

#=======COUNT(*),包括null和丢失的字段=======
POST /_xpack/sql?format=txt
{
    "query": "SELECT COUNT(*) AS all_count FROM dept" 
}

在这里插入图片描述
上一篇博客有这一类count的java api写法

6.1.2 COUNT(ALL field_name),只统计非null的值

#=======COUNT(ALL field_name),只统计非null的值=======
POST /_xpack/sql?format=txt
{
    "query": "SELECT COUNT(ALL status) AS status_count FROM dept" 
}

因为有一条数据的status=null,所以不统计它
在这里插入图片描述

6.1.3 COUNT(field_name),只统计非null的值

COUNT(field_name)和上面COUNT(ALL field_name)等效

#=======COUNT(field_name),只统计非null的值=======
POST /_xpack/sql?format=txt
{
    "query": "SELECT COUNT(status) AS status_count FROM dept" 
}

6.1.4 COUNT(DISTINCT field_name),只统计非null的值

#=======COUNT(DISTINCT field_name),只统计非null的值=======
POST /_xpack/sql?format=txt
{
    "query": "SELECT COUNT(DISTINCT status) AS status_count FROM dept" 
}

status的有效值只有0或者1
在这里插入图片描述

6.2 DSL描述

统计包含某一字段(比如status)的文档数,只统计非null的值

POST dept/_doc/_search?size=0
{
    "aggs" : {
        "status_count" : { 
          "value_count" : { "field" : "status" } }
    }
}

6.3 Java API 描述

统计包含某一字段(比如status)的文档数,只统计非null的值

public static long getCount(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
    getClient();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    searchSourceBuilder.size(0);
    
    ValueCountAggregationBuilder aggregation  = AggregationBuilders.count("agg").field(field);
    searchSourceBuilder.aggregation(aggregation);
    
    SearchRequest searchRequest = new SearchRequest(indexs).types(type);
    searchRequest.source(searchSourceBuilder);
    
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    ValueCount agg = searchResponse.getAggregations().get("agg");
    return agg.getValue();
}

7 STATS(统计)

7.1 DSL描述

POST /dept/_doc/_search
{
  "size":0,
  "aggs":{
    "stats_level": {
      "stats":{
        "field": "level"
      }
    }
  }
}

在这里插入图片描述

7.2 Java API 描述

public static Stats getStats(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {
    getClient();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(queryBuilder);
    searchSourceBuilder.size(0);
    
    StatsAggregationBuilder aggregation = AggregationBuilders.stats("agg").field(field);
    searchSourceBuilder.aggregation(aggregation);
    
    SearchRequest searchRequest = new SearchRequest(indexs).types(type);
    searchRequest.source(searchSourceBuilder);
    
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    Stats stats = searchResponse.getAggregations().get("agg");
    return stats;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我了解您的要求并会尽力回答您的问题。首先,Elasticsearch Java API提供了一些聚合操作,包括terms聚合和cardinality聚合,可以用于去重和计数。您可以在查询中使用这些聚合操作,并将结果换为您想要的格式。下面是一个示例代码片段,演示如何使用Elasticsearch Java API实现聚合去重并返回固定格式数据: ``` SearchRequest searchRequest = new SearchRequest("your-index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); TermsAggregationBuilder aggregation = AggregationBuilders.terms("your-term-aggregation").field("your-field").size(10); CardinalityAggregationBuilder subAggregation = AggregationBuilders.cardinality("your-sub-aggregation").field("your-subfield"); aggregation.subAggregation(subAggregation); searchSourceBuilder.aggregation(aggregation); searchRequest.source(searchSourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); Terms terms = response.getAggregations().get("your-term-aggregation"); List<MyData> results = new ArrayList<>(); for (Terms.Bucket bucket : terms.getBuckets()) { Cardinality cardinality = bucket.getAggregations().get("your-sub-aggregation"); MyData data = new MyData(); data.setField(bucket.getKeyAsString()); data.setCount(cardinality.getValue()); results.add(data); } return results; ``` 在这个代码片段中,我们首先创建了一个SearchRequest和SearchSourceBuilder对象,用于构建我们的查询。然后,我们创建了一个terms聚合(your-term-aggregation),它将根据您指定的字段(your-field)对结果进行分组,并返回每个分组的数量。我们还创建了一个cardinality聚合(your-sub-aggregation),它将在每个分组中去重计数。 然后,我们将这两个聚合操作组合起来,并将它们添加到我们的查询中。我们执行查询,并从响应中提取terms聚合结果。最后,我们遍历每个terms bucket,并提取我们想要的数据,将其换为MyData对象,并将它们添加到结果列表中。 请注意,此代码片段仅为示例,您需要将其调整为符合您的实际需求。同时,我会非常注重保护您的私密信息,绝不会透露任何关于您的任何信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值