您当前的位置: 首页 >  ar

墨家巨子@俏如来

暂无认证

  • 0浏览

    0关注

    188博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

七.全文检索ElasticSearch经典入门-聚合查询

墨家巨子@俏如来 发布时间:2022-04-09 22:50:50 ,浏览量:0

前言

今天我们讲ES的高亮和聚合查询,聚合功能是ES很重要的功能,它基于查询条件来对数据进行分桶和计算。它提供了类似于关系型数据库的SUM,COUNT, AVG , Group By 等功能。聚合也可以嵌套,可以组成复杂的操作。

聚合概述

ES聚合包括:Metrics Aggregations 指标聚合 ;Bucket Aggregations 桶聚合 ;Pipeline Aggregations 管道聚合 ;Matrix Aggregations 矩阵聚合;

  • Metrics Aggregations 指标聚合 :提供了类似于关系型数据库的 count,sum,avg,min,max 等统计方式。
  • Bucket Aggregations 桶聚合 :桶聚合类似于分组统计 group by , 它执行的是对文档分组的操作,把特性相同的文档分到一个桶里(理解成一个group)。
  • Pipeline Aggregations 管道聚合 : 管道聚合主要是把其他聚合的结果再进行聚合
  • Matrix Aggregations 矩阵聚合:矩阵聚合,此功能处于技术预览阶段,可能会在未来版本中更改或删除。

下面是聚合语法如下

GET /index/type/_search
{
  "query":{
    ...
  },
  "aggs":{
    "指定聚合名字":{
      "指定聚合方式":{
        "field":"按那个字段聚合"
      }
    }
  }
}

注意:本文并不会把ES所有的聚合都讲到,您可以通过官网自行学习其他的聚合如何使用 ,参考文档 ES聚合查询

指标聚合 Metrics Aggregations

指标聚合,它可以对文档数据进行权重统计,比如求:最大值,最小值,求和,求平均等。就如何关系型数据库中的统计函数。

MAX;MIN;SUM;AVG
  • Max Aggregation,求最大值。如同于关系型数据库中的 max函数

  • Min Aggregation,求最小值。如同于关系型数据库中的 min 函数

  • Sum Aggregation,求和。如同于关系型数据库中的 sum 函数

  • Avg Aggregation,求平均数。如同于关系型数据库中的 avg函数

案例:[Max Aggregation] : 查询价格最大值

GET /orders/_doc/_search
{
  "query":{
    "match":{
      "title":"鼠标"
    }
    
  },
  "aggs":{ 					//代表是聚合查询
    "maxAmount":{ 			//取个名字,任意指定
      "max":{ 				//使用max聚合方式
        "field":"amount" 	//按照amount字段做max聚合
      }
    }
  }
}

效果如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN7zWIcT-1649083199800)(课件图片/1633829754532.png)] 多种聚合一起用 在这里插入图片描述

统计聚合: Stats Aggregation

Stats Aggregation,统计聚合可以统计出某个字段的 :min、max、sum、count、avg5个值,案例:求金额的:最小,最大,总和,数量,平均值。

GET /orders/_doc/_search
{
  "query":{
    "match":{
      "title":"鼠标"
    }
    
  },
  "aggs":{
    "statsAmount":{
      "stats":{
        "field":"amount"
      }
    }
  }
}

执行效果如下 在这里插入图片描述

值计数聚合 Value Count Aggregation

Value Count Aggregation,值计数聚合,可以按照某一个字段进行数量统计,类似于关系型数据库的count(id)的效果,案例:统计订单数量

GET /orders/_doc/_search
{
  "query":{
    "match":{
      "title":"鼠标"
    }
    
  },
  "aggs":{
    "countAmount":{
      "value_count":{
        "field":"id"
      }
    }
  }
}

执行效果如下 在这里插入图片描述

去重 distinct 聚合

distinct 聚合可以根据某个字段计算文档非重复的个数(去重计数),相当于sql中的distinct。案例:计算出商品数量,标题去重

GET /orders/_doc/_search
{
  
  "aggs":{
    "countAmount":{
      "cardinality":{
        "field":"status"
      }
    }
  }
}

查询效果如下 在这里插入图片描述

百分比统计Percentiles Aggregation

Percentiles Aggregation,百分比聚合,可以统计出满足某个值的文档在所有文档中的占比,默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值。案例: 在这里插入图片描述- “1.0”:100.0 :代表金额 { //聚合名字 String aggName = aggregationEntry.getKey(); Aggregation aggregation = aggregationEntry.getValue(); System.out.println("聚合名字 = "+aggName); if(aggregation instanceof ParsedLongTerms){ //对应terms聚合 ParsedLongTerms agg = (ParsedLongTerms) aggregation; agg.getBuckets().forEach(bucket->{ String key = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); System.out.println("key = "+key +" ; docCount = "+docCount); }); } if(aggregation instanceof ParsedStats){ //对应stats聚合 ParsedStats agg = (ParsedStats) aggregation; System.out.println(agg.getAvg()); System.out.println(agg.getMax()); System.out.println(agg.getCount()); System.out.println(agg.getSum()); System.out.println(agg.getMin()); } if(aggregation instanceof ParsedSum){ //对应sum聚合 ParsedSum agg = (ParsedSum) aggregation; System.out.println(agg.getValue()); } }); }

你可以编写一个结果对象对文档列表数据和聚合数据进行封装,然后返回给前端页面。这里打印的效果如下 在这里插入图片描述

文章结束,希望对你有所帮助,喜欢的话请给个好评,评论过百,我就是秃头也出下章。

关注
打赏
1651329177
查看更多评论
立即登录/注册

微信扫码登录

0.0767s