es常用聚合查询及案例

1、单值输出 常用有:min 、max、sum、avg、cardinality(去重求和)

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "avg_sal": {
      "avg": {
        "field": "sal"  //工资平均值
      }
    },
    "max_val": {
      "max": {
        "field": "sal"   //工资最大值
      }
    },
    "min_val": {
      "min": {
        "field": "sal"    //工资最小值
      }
    },
    "cardibality_count": {
      "cardinality": {
        "field": "job"       //岗位数
      }
    }
  }
}
复制代码

2、多值输出  可以一次统计处多个数据:terms 、stats

2.1 stats:根据查询的字段求查询的数量、最大值、最小值、平均值、总和

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "stats_info": {
      "stats": {
        "field": "sal"
      }
    }
  }
}
复制代码

查询结果

复制代码
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 16,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "stats_info": {
      "count": 16,
      "min": 2000,
      "max": 23000,
      "avg": 13281.25,
      "sum": 212500
    }
  }
}
复制代码

2.2 terms查询:根据查询条件进行分组并统计每一组的总数

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "job_count": {
      "terms": {
        "field": "job"  //查询每个岗位有多少人
      }
    }
  }
}
复制代码

返回值

复制代码
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 16,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "job_count": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "java",
          "doc_count": 7
        },
        {
          "key": "dba",
          "doc_count": 5
        },
        {
          "key": "html",
          "doc_count": 4
        }
      ]
    }
  }
}
复制代码

2.3 terms查询嵌套  

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "job_count": {
      "terms": {
        "field": "job"  //查询不同岗位下的人数
      },
      "aggs": {
        "gender_count": {
          "terms": {
            "field": "gender" //查询不同岗位下不同性别的人数
          }
        }
      }
    }
  }
}
复制代码
复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "job_count": {
      "terms": {
        "field": "job"  //查询不同岗位下工资的详情(总数、最大值、最小值、平均值、和)
      },
      "aggs": {
        "stats_count": {
          "stats": {
            "field": "sal"
          }
        }
      }
    }
  }
}
复制代码

还可以套3层 4层。。。。

2.3 top_hits查询 查询年龄最大的两名员工信息

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "top_age_infot": {
      "top_hits": {
        "size": 2,
        "sort": [
              {
              "age": {
              "order":"desc"
              }
            }
          ]
      }
    }
  }
}
复制代码

2.4 range查询 范围统计查询

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "range_infot": {
      "range": {
        "field": "sal",  //统计每个工资段的员工数量
        "ranges": [
          {
            "key": "0-5000", 
            "from": 0,
            "to": 5000
          },
          {
            "key": "5000-10000", 
            "from": 5000,
            "to": 10000
          },
          {
            "key": "10000<", 
            "from": 10000
          }
        ]
      }
    }
  }
}
复制代码

2.5 histogram直方图区间统计

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "histogram_info": {
      "histogram": {
        "field": "sal",
        "interval": 5000  //以5000一个区间统计人数
      }
    }
  }
}
复制代码

 2.6 max_bucket查询每个桶的最大值,min_bucket查询每个桶的最小值

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "job_info": {
      "terms": {
        "field": "job"
      },
      "aggs": {
        "job_avg_info": {
          "avg": {
            "field": "sal"
          }
        }
      }
    },
    "min_avg_sal_job":{
      "max_bucket": {
        "buckets_path": "job_info>job_avg_info"  //查询平均工资最高的岗位
      }
    }
  }
}
复制代码

2.7 查询年龄大于30岁的员工平均工资

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "query": {
    "range": {
      "age": {
        "gte": 30
      }
    }
  }, 
  "aggs": {
    "sal_info": {
      "avg": {
        "field": "sal"
      }
    }
  }
}
复制代码

2.8 查询java员工的平均工资

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "query": {
    "constant_score": {  //不会计算分数,用于聚合查询时可以提高效率
      "filter": {
        "term": {
          "job": "java"
        }
      }
    }
  }, 
  "aggs": {
    "java_avg_sal_info": {
      "avg": {
        "field": "sal"
      }
    }
  }
}
复制代码

2.9 局部过滤:查询所有员工平均工资和年龄大于30岁员工平均工资

复制代码
GET cwtest/employee/_search
{
  "size": 0, 
  "aggs": {
    "sal_avg": {
      "avg": {
        "field": "sal"
      }
    },
    "gt_30_avg_info": {
      "filter": {   //局部过滤
        "range": {
          "age": {
            "gt": 30
          }
        }
      },
      "aggs": {
        "gt_30_avg_sal": {
          "avg": {
            "field": "sal"
          }
        }
      }
    }
  }
}
复制代码

 

posted @   曹伟666  阅读(3222)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示