在 ES 中group by 称为分桶桶聚合 bucketing

指标聚合

max、min、sum、avg

  1. # size只返回聚合指标
  2. POST /book/_search
  3. {
  4. "size": 0,
  5. "aggs": {
  6. "max_price": {
  7. "max": {
  8. "field": "price"
  9. }
  10. }
  11. }
  12. }
  13. # avg
  14. POST /book/_search
  15. {
  16. "size": 0,
  17. "aggs": {
  18. "max_price": {
  19. "avg": {
  20. "field": "price"
  21. }
  22. }
  23. }
  24. }

count

  1. POST /book/_count
  2. {
  3. "query": {
  4. "range": {
  5. "price": {
  6. "gt": 100
  7. }
  8. }
  9. }
  10. }

value_count 统计某字段有值的文档数

例如 统计某字段不为null 的数据量

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "price_count": {
  6. "value_count": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

cardinality值去重计数 基数

Cardinality:意为集合的势,或者基数,是指不同数值的个数,类似SQL中的distinct count概念

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "_id_count": {
  6. "cardinality": {
  7. "field": "_id"
  8. }
  9. },
  10. "price_count":{
  11. "cardinality": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }

**响应结果**

  1. ...
  2. "aggregations" : {
  3. "price_count" : {
  4. "value" : 4
  5. },
  6. "_id_count" : {
  7. "value" : 4
  8. }
  9. }

stats统计指标

stats会统计 min、max、avg、sum、count;
extended_stats会统计更多指标: 方差、平方和、标准差

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "price_stats": {
  6. "stats": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

**响应结果**

  1. "aggregations" : {
  2. "price_stats" : {
  3. "count" : 4,
  4. "min" : 100.44999694824219,
  5. "max" : 999.989990234375,
  6. "avg" : 455.4699993133545,
  7. "sum" : 1821.879997253418
  8. }
  9. }

桶聚合

类似sql的group by

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_price": {
  6. "range": {
  7. "field": "price",
  8. "ranges": [
  9. {
  10. "from": 0,
  11. "to": 200
  12. },{
  13. "from": 200,
  14. "to": 400
  15. },
  16. {
  17. "from": 400,
  18. "to": 1000
  19. }
  20. ]
  21. },
  22. "aggs": {
  23. "avg_price": {
  24. "avg": {
  25. "field": "price"
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }

查询数量

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "price_count": {
  6. "value_count": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

组合
sql语句类似 select avg(price),count(price) from table group by price

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_price": {
  6. "range": {
  7. "field": "price",
  8. "ranges": [
  9. {
  10. "from": 0,
  11. "to": 200
  12. },
  13. {
  14. "from": 200,
  15. "to": 400
  16. },
  17. {
  18. "from": 400,
  19. "to": 1000
  20. }
  21. ]
  22. },
  23. "aggs": {
  24. "avg_price": {
  25. "avg": {
  26. "field": "price"
  27. }
  28. },
  29. "count_price": {
  30. "value_count": {
  31. "field": "price"
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }

实现having效果
在 aggs中用having来实现sql中的having中的效果

  1. POST /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_price": {
  6. "range": {
  7. "field": "price",
  8. "ranges": [
  9. {
  10. "from": 0,
  11. "to": 200
  12. },
  13. {
  14. "from": 200,
  15. "to": 400
  16. },
  17. {
  18. "from": 400,
  19. "to": 1000
  20. }
  21. ]
  22. },
  23. "aggs": {
  24. "avg_price": {
  25. "avg": {
  26. "field": "price"
  27. }
  28. },
  29. "count_price": {
  30. "value_count": {
  31. "field": "price"
  32. }
  33. },
  34. "having": {
  35. "bucket_selector": {
  36. "buckets_path": {
  37. "avg_price_result" :"avg_price"
  38. },
  39. "script": "params.avg_price_result >= 200"
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }

terms 聚合

搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情

  1. GET bank/_search
  2. {
  3. "query": { # 查询出包含mill
  4. "match": {
  5. "address": "Mill"
  6. }
  7. },
  8. "aggs": { #基于查询聚合
  9. "ageAgg": { # 聚合的名字,随便起
  10. "terms": { # 看值的可能性分布
  11. "field": "age",
  12. "size": 10
  13. }
  14. },
  15. "ageAvg": {
  16. "avg": { # age值的平均
  17. "field": "age"
  18. }
  19. },
  20. "balanceAvg": {
  21. "avg": { # balance的平均
  22. "field": "balance"
  23. }
  24. }
  25. },
  26. "size": 0 # 不看详情
  27. }

按照年龄聚合,并且求这些年龄段的这些人的平均薪资

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "aggs": {
  7. "ageAgg": {
  8. "terms": { # 看分布
  9. "field": "age",
  10. "size": 100
  11. },
  12. "aggs": { # terms并列
  13. "ageAvg": { #平均
  14. "avg": {
  15. "field": "balance"
  16. }
  17. }
  18. }
  19. }
  20. },
  21. "size": 0
  22. }

复杂子聚合:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "aggs": {
  7. "ageAgg": {
  8. "terms": { # age分布
  9. "field": "age",
  10. "size": 100
  11. },
  12. "aggs": { # 子聚合
  13. "genderAgg": {
  14. "terms": { # gender分布
  15. "field": "gender.keyword" # 注意这里,文本字段应该用.keyword
  16. },
  17. "aggs": { # 子聚合
  18. "balanceAvg": {
  19. "avg": { # 男性的平均
  20. "field": "balance"
  21. }
  22. }
  23. }
  24. },
  25. "ageBalanceAvg": {
  26. "avg": { #age分布的平均(男女)
  27. "field": "balance"
  28. }
  29. }
  30. }
  31. }
  32. },
  33. "size": 0
  34. }