文章目录
聚合操作
聚合查询的语法结构与其他查询相似,通常包含以下部分:
- 查询条件:指定需要聚合的文档,可以使用标准的 Elasticsearch 查询语法,如 term、match、range 等等。
- 聚合函数:指定要执行的聚合操作,如 sum、avg、min、max、terms、date_histogram 等等。每个聚合命令都会生成一个聚合结果。
- 聚合嵌套:聚合命令可以嵌套,以便更细粒度地分析数据。
GET <index_name>/_search
{
"aggs": {
"<aggs_name>": {
# 聚合名称需要自己定义
"<agg_type>": {
# 聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)
"field": "<field_name>" # field_name 字段名称或者叫域名。
}
}
}
}
聚合操作一般都是操作的术语级别的字段,一般不会操作text类型的字段
聚合的分类
- Metric Aggregation:—些数学运算,可以对文档字段进行统计分析,类比Mysql中的 min(), max(), sum() 操作。
GET /sys_user/_search
{
"aggs": {
"hs_avg_age": {
"avg": {
# 这里还可以使用 max min 等等
"field": "age"
}
}
}
}
-
Bucket Aggregation: 一些满足特定条件的文档的集合放置到一个桶里,每一个桶关联一个key,类比Mysql中的group by操作。
# 使用terms关键字 # 类似于关系型数据库的分组操作 # 先分组 再求和 GET /sys_user/_search { "aggs": { "hs_terms_age": { "terms": { # 使用terms关键字 "field": "age" } } } }
- Pipeline Aggregation:对其他的聚合结果进行二次聚合
测试数据
聚合操作一般都是操作术语级别的字段,比较少操作text类型的字段
DELETE /employees
#创建索引库
PUT /employees
{
"mappings": {
"properties": {
"age":{
"type": "integer"
},
"gender":{
"type": "keyword"
},
"job":{
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 50
}
}
},
"name":{
"type": "keyword"
},
"salary":{
"type": "integer"
}
}
}
}
PUT /employees/_bulk
{
"index" : {
"_id" : "1" } }
{
"name" : "Emma","age":32,"job":"Product Manager","gender":"female","salary":35000 }
{
"index" : {
"_id" : "2" } }
{
"name" : "Underwood","age":41,"job":"Dev Manager","gender":"male","salary": 50000}
{
"index" : {
"_id" : "3" } }
{
"name" : "Tran","age":25,"job":"Web Designer","gender":"male","salary":18000 }
{
"index" : {
"_id" : "4" } }
{
"name" : "Rivera","age":26,"job":"Web Designer","gender":"female","salary": 22000}
{
"index" : {
"_id" : "5" } }
{
"name" : "Rose","age":25,"job":"QA","gender":"female","salary":18000 }
{
"index" : {
"_id" : "6" } }
{
"name" : "Lucy","age":31,"job":"QA","gender":"female","salary": 25000}
{
"index" : {
"_id" : "7" } }
{
"name" : "Byrd","age":27,"job":"QA","gender":"male","salary":20000 }
{
"index" : {
"_id" : "8" } }
{
"name" : "Foster","age":27,"job":"Java Programmer","gender":"male","salary": 20000}
{
"index" : {
"_id" : "9" } }
{
"name" : "Gregory","age":32,"job":"Java Programmer","gender":"male","salary":22000 }
{
"index" : {
"_id" : "10" } }
{
"name" : "Bryant","age":20,"job":"Java Programmer","gender":"male","salary": 9000}
{
"index" : {
"_id" : "11" } }
{
"name" : "Jenny","age":36,"job":"Java Programmer","gender":"female","salary":38000 }
{
"index" : {
"_id" : "12" } }
{
"name" : "Mcdonald","age":31,"job":"Java Programmer","gender":"male","salary": 32000}
{
"index" : {
"_id" : "13" } }
{
"name" : "Jonthna","age":30,"job":"Java Programmer","gender":"female","salary":30000 }
{
"index" : {
"_id" : "14" } }
{
"name" : "Marshall","age":32,"job":"Javascript Programmer","gender":"male","salary": 25000}
{
"index" : {
"_id" : "15" } }
{
"name" : "King","age":33,"job":"Java Programmer","gender":"male","salary":28000 }
{
"index" : {
"_id" : "16"