聚合查询

原文链接:https://blog.csdn.net/zjun1001/article/details/124536727

平均值、总和、最大、最小、数量

在es中,所有的聚合查询都是放在aggs中进行的。平均值、总和、最大、最小、数量对应的关键字分别是:avg、sum、max、min、value_count

  1. POST /bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill"
  6. }
  7. },
  8. "aggs": {
  9. "ageAvg": {
  10. "avg": {
  11. "field": "age"
  12. }
  13. },
  14. "ageSum": {
  15. "sum": {
  16. "field": "age"
  17. }
  18. },
  19. "ageMax":{
  20. "max": {
  21. "field": "age"
  22. }
  23. },
  24. "ageMin":{
  25. "min": {
  26. "field": "age"
  27. }
  28. },
  29. "ageCount":{
  30. "value_count": {
  31. "field": "age"
  32. }
  33. }
  34. },
  35. "size": 0
  36. }

分组

分组用到的关键字是terms

  1. POST /bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill"
  6. }
  7. },
  8. "aggs": {
  9. "ageGroup": {
  10. "terms": {
  11. "field": "age",
  12. "size": 3
  13. }
  14. }
  15. },
  16. "size": 0
  17. }

上面语句中的size:3,指的是分组后,只展示前三个分组内容。size:0,指的是所有query查询结果,也就是原始数据,不需要展示。此外,还可以对分组内容进行排序。

1.分组后,按分组内的文档数量排序

  1. POST /bank/_search
  2. {
  3. "aggs": {
  4. "ageGroup": {
  5. "terms": {
  6. "field": "age",
  7. "order": {
  8. "_count": "asc"
  9. }
  10. }
  11. }
  12. },
  13. "size": 0
  14. }

2.分组后,按分组字段排序

  1. POST /bank/_search
  2. {
  3. "aggs": {
  4. "ageGroup": {
  5. "terms": {
  6. "field": "age",
  7. "order": {
  8. "_key": "desc"
  9. }
  10. }
  11. }
  12. },
  13. "size": 0
  14. }

3.显示分组后,文档数量大于60的

  1. POST /bank/_search
  2. {
  3. "aggs": {
  4. "ageGroup": {
  5. "terms": {
  6. "field": "age",
  7. "min_doc_count": 60
  8. }
  9. }
  10. },
  11. "size": 0
  12. }

分组+子聚合

先按age分组,之后统计分组内的平均值和总和。

  1. POST /bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill"
  6. }
  7. },
  8. "aggs": {
  9. "ageAgg": {
  10. "terms": {
  11. "field": "age",
  12. "size": 3
  13. },
  14. "aggs": {
  15. "ageAvg": {
  16. "avg": {
  17. "field": "age"
  18. }
  19. },
  20. "ageSum": {
  21. "sum": {
  22. "field": "age"
  23. }
  24. }
  25. }
  26. }
  27. },
  28. "size": 0
  29. }

分段分组+子聚合

先按age分组,分成18-28、28-38两组。之后统计各组的最小值和平均值。

  1. POST /bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill Road"
  6. }
  7. },
  8. "aggs": {
  9. "ageGroup": {
  10. "range": {
  11. "field": "age",
  12. "ranges": [
  13. {
  14. "from": 18,
  15. "to": 28
  16. },
  17. {
  18. "from": 28,
  19. "to": 38
  20. }
  21. ]
  22. },
  23. "aggs":{
  24. "ageMin":{
  25. "min": {
  26. "field": "age"
  27. }
  28. },
  29. "ageAve":{
  30. "avg": {
  31. "field": "age"
  32. }
  33. }
  34. }
  35. }
  36. },
  37. "size": 0
  38. }

指定分组+聚合

查询全部,但分组时候,只统计age=30的所有文档的平均值,最大最小等数据,用stats关键字代表。

  1. POST /bank/_search
  2. {
  3. "aggs": {
  4. "ageGroup": {
  5. "filter": {
  6. "term": {
  7. "age": "30"
  8. }
  9. },
  10. "aggs": {
  11. "stat": {
  12. "stats": {
  13. "field": "age"
  14. }
  15. }
  16. }
  17. }
  18. },
  19. "size": 0
  20. }

多种聚合结果统一查询

这里的多种聚合,指的是常用的平均值、最大最小、总和等。除了开始讲到的min、max、avg等关键字外,还可以用stats关键字。一个stats就可以包含min/max/avg/sum等。

  1. POST /bank/_search
  2. {
  3. "query": {
  4. "range": {
  5. "age": {
  6. "gte": 10,
  7. "lte": 20
  8. }
  9. }
  10. },
  11. "aggs": {
  12. "stat": {
  13. "stats": {
  14. "field": "age"
  15. }
  16. }
  17. },
  18. "size": 0
  19. }