聚合分类

  • Bucket Aggregation - 一些满足特定条件的文档的集合
    • terms:根据某个值统计
      • text类型需要根据有keyword才行,否则需要设置fielddata设置true
      • 优化:keyword类型字段,打开eager_global_ordinals:true
        • 当有新数据写入缓存到cache

GET accounts/_search{
"size": 0,
"aggs": {
"genderBucket": {
"terms": { "field": "gender.keyword" },
"aggs": {
"ageBucket": { "terms": { "field": "age","order": { "_key": "asc" } } } } } }

  • 数字类型:

    • range、Date Range

      1. // range
      2. post employees/_search
      3. {
      4. "size":0,
      5. "aggs":{
      6. "salary_range":{
      7. "range":{
      8. "field":"salary",
      9. "ranges":[
      10. {
      11. "to":10000
      12. },
      13. {
      14. "from": 10000,
      15. "to":20000
      16. },
      17. {
      18. "key":">20000",
      19. "from":20000
      20. }
      21. ]
      22. }
      23. }
      24. }
      25. }
    • Histogram、Date Histogram

      1. post employee/_search
      2. {
      3. "size":0,
      4. "aggs":{
      5. "salsry_histogram":{
      6. "field":"salary",
      7. "interval":5000, //分桶区间
      8. "extended_bounds":{
      9. "min":0,
      10. "max":100000
      11. }
      12. }
      13. }
      14. }
  • 支持嵌套

    • Matric Aggregation - 一些数学运算,可以对文档字段进行统计分析
  • 单值:min / max / sum / avg / cardinality(类似distinct count)
  • 多值:
    • stats,extended stats 输出多值
    • percentile,percentile rank 百分比
    • top hits 排在前面的示例
  • Terms聚合性能优化

    • 开启预加载:eager_global_ordinals
    • 适合索引不断有新的文档写入,对聚合性能有要求的

      1. PUT accounts/_mapping
      2. {
      3. "properties": {
      4. "gender":{
      5. "type": "text",
      6. "eager_global_ordinals": true
      7. }
      8. }
      9. }
      1. GET accounts/_search
      2. {
      3. "size": 0,
      4. "aggs": {
      5. "genderBucket": {
      6. "terms": {
      7. "field": "gender.keyword",
      8. ""
      9. },
      10. "aggs": {
      11. "ageBucket": {
      12. "terms": {
      13. "field": "age",
      14. "size": 30,
      15. "order": {
      16. "_key": "asc"
      17. }
      18. }
      19. },
      20. "old":{
      21. "top_hits": {
      22. "size": 3,
      23. "sort": [
      24. {
      25. "age":{
      26. "order": "desc"
      27. }
      28. }
      29. ]
      30. }
      31. }
      32. }
      33. }
      34. }
      35. }
      36. // range
      37. POST accounts/_search
      38. {
      39. "size": 0,
      40. "aggs": {
      41. "age_range": {
      42. "range": {
      43. "field": "age",
      44. "ranges": [
      45. {
      46. "to": 20
      47. },
      48. {
      49. "from": 20,
      50. "to": 25
      51. },
      52. {
      53. "from": 25,
      54. "to": 30
      55. }
      56. ]
      57. }
      58. }
      59. }
      60. }
      61. // 直方图
      62. POST accounts/_search
      63. {
      64. "size": 0,
      65. "aggs": {
      66. "age_histogram": {
      67. "histogram": {
      68. "field": "age",
      69. "interval": 5,
      70. "extended_bounds": {
      71. "min": 15,
      72. "max": 50
      73. }
      74. }
      75. }
      76. }
      77. }
  • Pipeline Aggregation - 对其他的聚合结果进行二次聚合

    • 支持对聚合分析结果,再次进行聚合分析
    • 根据分析结果输出位置不同,分两类
      • sibling-结果和现有分析结果同级
        • Max,min,avg & sum bucket
        • Stats,Extended Status Bucket
        • Percentiles Bucket
      • Parent - 结果内嵌到现有聚合分析的结果中
        • Derivative(求导)
        • Cumulative Sum(累计)
        • Moving Function(滑动窗口)
    • buckets_path:在员工数最多的工种里,找出平均工资最低的工种
      1. post employees/_search
      2. {
      3. "size":0,
      4. "aggs":{
      5. "jobs":{
      6. "terms":{
      7. "field":"job.keyword",
      8. "size":10
      9. },
      10. "aggs":{
      11. "avg_salary":{
      12. "avg":{
      13. "field":"salary"
      14. }
      15. }
      16. }
      17. },
      18. "min_salary_by_job":{
      19. "min_bucket":{
      20. "buckets_path":"jobs>avg_salary"
      21. }
      22. }
      23. }
      24. }
  • Matrix Aggregation - 支持对多个字段的操作并提供一个结果矩阵

SELECT COUNT(*) -> Metric:统计运算
FROM cars
GROUP BY brand -> Bucket:分组,一组满足条件的文档

作用范围与排序

  • ES聚合分析的默认作用范围是query的查询结果集
  • ES支持以下方式改变聚合的作用范围:
    • Filter
    • post_filter
    • Global
  • 指定order,按照count和key进行排序

    • 默认情况,按照count降序排序
    • 指定size,就能返回相应的桶
      1. post employees/_search
      2. {
      3. "aggs":{
      4. "jobs":{
      5. "terms":{
      6. "field":"job.keyword",
      7. "order":[
      8. {"_count":"asc"}
      9. ]
      10. }
      11. }
      12. }
      13. }

      聚合分析精准度和原理

  • min聚合分析的执行流程

    • 1、请求到达Coordinating Node,到所有分片上获取最小值,再将结果求最小值返回
  • terms aggregation
    • 返回值
      • doc_count_error_upper_bound:被遗漏的term分桶,包含的文档,有可能的最大值
      • sum_other_doc_count:除了返回结果bucket的terms以外,其他terms的文档总数(总数-返回的总数)
    • terms结果不正确案例:
      • image.png
    • terms不准确问题解决:提升shard_size的参数
      • 原因:无法获取数据全貌
      • 原理:每次从shard上额外多获取数据,提升准确率
      • shard_size默认设定:size*1.5+10