类似于SQL语言中的group by,avg,sum等函数
但Aggregations API还提供了更加复杂的统计分析接口。

聚合方式 解释
Bucket Aggregation 一些满足特定条件的文档的集合
相当于SQL中的group by
Metric Aggregation 一些数学计算,可以对文档字段统计分析
基于Buckets的基础上进行统计分析,相当于SQL中的count,avg,sum等
Pipeline Aggregation 对其他的聚合结果进行二次聚合
Metrix Aggregation 支持对多个字段的操作并提供一个结果矩阵

bucket分组聚合

term分组+过滤

  1. GET employee/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "job_analysis": {
  6. "terms": {
  7. "field": "job"
  8. },
  9. "aggs": {
  10. "age_top_1": {
  11. "top_hits": {
  12. "size": 1,
  13. "sort": [
  14. {
  15. "age": {
  16. "order": "desc"
  17. }
  18. }
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }

过滤后分组

  1. {
  2. "size":10,
  3. "query":{
  4. "bool":{
  5. "filter":[
  6. {
  7. "term":{
  8. "classid":187010
  9. }
  10. }
  11. ]
  12. }
  13. },
  14. "aggs":{
  15. "lesson_aggs":{
  16. "terms":{
  17. "field":"lessonstatus"
  18. }
  19. }
  20. }
  21. }

range

  1. GET employee/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "sal_range_info": {
  6. "range": {
  7. "field": "sal",
  8. "ranges": [
  9. {
  10. "to": 5000
  11. },
  12. {
  13. "from": 5001,
  14. "to": 8000
  15. },
  16. {
  17. "from": 8000
  18. }
  19. ]
  20. }
  21. }
  22. }
  23. }

根据脚本分组

  1. GET /community_user_bigtable/_doc/_search?
  2. {
  3. "size":0,
  4. "_source":false,
  5. "query":{
  6. "bool":{
  7. "filter":[
  8. {
  9. "term":{
  10. "classid":187010
  11. }
  12. }
  13. ]
  14. }
  15. },
  16. "aggs":{
  17. "class_aggs":{
  18. "terms":{
  19. "script":"doc['lessonstatus'].value/10==2"
  20. },
  21. "aggs":{
  22. "test":{
  23. "terms":{
  24. "script":"doc['lessonstatus'].value%10"
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }

根据filter分组

  1. GET /community_user_bigtable/_doc/_search?
  2. {
  3. "size":0,
  4. "_source":false,
  5. "aggs":{
  6. "class_aggs":{
  7. "terms":{
  8. "field":"classid",
  9. "order": [{"isFillPaperSum":"desc"} ]
  10. },
  11. "aggs":{
  12. "isFillPaperSum":{
  13. "sum":{
  14. "field":"isfillpaper"
  15. }
  16. },
  17. "loginFilter":{
  18. "filter":{
  19. "range": {
  20. "data_logintime": {
  21. "gte": 0
  22. }
  23. }
  24. }
  25. },
  26. "lessonStatusFilter":{
  27. "filter":{
  28. "range": {
  29. "lessonstatus": {
  30. "lte": 60,
  31. "gte": 50
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }

order分组后排序

  1. {
  2. "aggs" : {
  3. "genders" : {
  4. "terms" : {
  5. "field" : "gender",
  6. "order" : { "_count" : "asc" }
  7. }
  8. }
  9. }
  10. }

也可以根据子聚合排序

  1. {
  2. "aggs" : {
  3. "genders" : {
  4. "terms" : {
  5. "field" : "gender",
  6. "order" : { "avg_balance" : "desc" }
  7. },
  8. "aggs" : {
  9. "avg_balance" : { "avg" : { "field" : "balance" } }
  10. }
  11. }
  12. }
  13. }

子聚合内字段排序

  1. {
  2. "aggs" : {
  3. "genders" : {
  4. "terms" : {
  5. "field" : "gender",
  6. "order" : { "balance_stats.avg" : "desc" }
  7. },
  8. "aggs" : {
  9. "balance_stats" : { "stats" : { "field" : "balance" } }
  10. }
  11. }
  12. }
  13. }

histogram aggregation 支持 sort 但是并不支持 size

  1. {
  2. "aggs": {
  3. "ipo_year_range": {
  4. "aggs": {
  5. "max_market_cap": {
  6. "max": {
  7. "field": "market_cap"
  8. }
  9. }
  10. },
  11. "histogram": {
  12. "field": "ipo_year",
  13. "interval": 10,
  14. "order": {
  15. "_key": "asc"
  16. }
  17. }
  18. }
  19. },
  20. "size": 0
  21. }

Metric聚合(max/min/avg/sum)

stats统计

  1. GET employee/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "job_and_salary_info": {
  6. "terms": {
  7. "field": "job"
  8. },
  9. "aggs": {
  10. "sal_info": {
  11. "stats": {// avg/sum
  12. "field": "sal"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

直接sum/avg…某个字段

  1. curl 'http://10.202.11.117:9200/testindex/orders/_search?pretty' -d '
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "return_expires_in": {
  6. "sum": { // min
  7. "field": "expires_in"
  8. }
  9. }
  10. }
  11. }'

分组后求百分比

  1. {
  2. "size": 0,
  3. "aggs": {
  4. "states": {
  5. "terms": {
  6. "field": "gender"
  7. },
  8. "aggs": {
  9. "banlances": {
  10. "percentile_ranks": {
  11. "field": "balance",
  12. "values": [
  13. 20000,
  14. 40000
  15. ]
  16. }
  17. }
  18. }
  19. }
  20. }

filter nested后聚合

  1. {
  2. "size":0,
  3. "query":{
  4. "filtered":{
  5.     "filter":{
  6.     "nested":{
  7.     "path":"nna_risks",
  8.     "filter":{
  9.     "exists":{
  10.     "field":"nna_risks.ina_id"
  11.     }
  12.     }
  13.      }
  14.     }
  15.   }  },
  16. "aggs":{
  17. "level0":{
  18. "terms":{
  19. "script":"doc['inp_type'].value"
  20. }
  21. }
  22. }
  23. }

对聚合结果过滤

  1. {
  2. "aggs": {
  3. "t_shirts": {
  4. "filter": { "term": { "SOURCETYPE": "0" } },
  5. "aggs": {
  6. "term": { "avg": { "field": "TITLE.KEYWORD" } }
  7. }
  8. }
  9. }
  10. }
  1. {
  2. "size": 0,
  3. "aggs" : {
  4. "messages" : {
  5. "filters" : {
  6. "filters" : {
  7. "errors" : { "match" : { "SOURCETYPE" : "0" }},
  8. "warnings" : { "match" : { "SOURCETYPE" : "1" }}
  9. }
  10. }
  11. }
  12. }
  13. }

返回值解析

1、ES某些聚合统计会存在损失精准度的问题
2、损失精准度的原因是分片处理中间结果,汇总引起的误差,是ES实时性和精准度的权衡
3、可以通过调大shard_size等方法增加精准度

1)、doc_count_error_upper_bound:表示没有在这次聚合中返回,但是可能存在的潜在聚合结果。

2)、sum_other_doc_count:表示这次聚合中没有统计到的文档数。这个好理解,因为ES统计的时候默认只会根据count显示排名前十的分桶。如果分类(这里是目的地)比较多,自然会有文档没有被统计到。

其他参考

https://www.cnblogs.com/duanxz/p/6528161.html
https://www.jianshu.com/p/1b430a637971