记录自己使用到的es聚合查询,一下均为查询时elastic.search(index=‘abc’, doc_type=’_doc’, body=body)的body内容
{
"aggs": { # 聚合查询
"2": { #聚合查询的名称,与结果是相对应的
"terms": { #terms聚合是其中一种类型
"field": "layers.ip.ip", # 根据哪一个字段来进行聚合查询
"order": {"1": "desc"}, # 默认是 "order" : { "_count" : "desc" } 数量查询(可不填),但是我们可以进行自定义,自定义时,key就是和子aggs的key保持一致
"size": 10, # 要统计的前几名,这个是必须要有的,不然如果有多个分片就会出现数据不对等的情况,导致数据偏差
"min_doc_count": 10, # 该表示统计的字段数如果layers.ip.ip不超过10个,则不相应,默认是1
},
"aggs": {
"1": { # 与上述order的key值保持一致
"sum": { # 定义不同的计算方法,sum表示求和,max表示取最大值, min最小值,avg平均值
"field": "layers.frame.frame_frame_cap_len" # 对哪一个字段进行求和
}
}
}
}
},
"size": 0, # hits.hits中的数据量的多少
"stored_fields": ["*"], # 也是控制字段显示,设置了这个不设置_source,_source默认是不显示的,没有特殊需求可以不用
"script_fields": {}, # 功能与docvalue_fields相同,只不过设置了script_fields,不设置_source,_source默认是不显示的,没有特殊需求可以不用
"docvalue_fields": [{ # 在hits.hits中的每一条数据中添加一个"fields" : { "@timestamp" : [ "2020-05-22T09:20:09.774Z" ] }
"field": "@timestamp",
"format": "date_time" # date_time就是2020-05-22T09:20:09.774Z这种格式,epoch_millis得到的就是一个毫秒级的数字
}],
"_source":{
"includes":["*.lon","*.lat"], // 在hits.hits中包含.lon,.lat的字段需要返回, 如果没有不需要返回的字段,可以简写为"_source":["OriginCountry","DestCountry"]
"excludes":"DestLocation.*" // 在hits.hits中包含DestLocation.的字段不需要返回
}
"query": {
"bool": {
"must": [],
"filter": [{
"range": {
"@timestamp": {
"gte": "2020-05-22T09:00:00.000Z",
"lte": "2020-05-22T09:30:00.000Z",
"format": "strict_date_optional_time"
}
}
}],
"should": [],
"must_not": []
}
}
}
{
"aggs": {
"2": {
"terms": {
"field": "layers.ip.ip",
"order" : { "_count" : "desc" },
"size": 10
}
}
},
"size": 0,
"query": {
}
}
{
"aggs": {
"2": {
"terms": {
"field": "layers.ip.ip",
"order": {"1": "desc"},
"size": 10
},
"aggs": {
"1": {
"sum": {
"field": "layers.frame.frame_frame_cap_len"
}
}
}
}
},
"size": 0,
"query": {
}
}
{
"aggs": {
"2": {
"date_histogram": { # es自带的时间处理函数
"field": "@timestamp", // 需要聚合分组的字段名称, 类型需要为date, 格式没有要求
"fixed_interval": "30s", # 统计的时间间隔
"time_zone": "Asia/Shanghai", # 设置时区,也可以使用"time_zone":"+08:00",
"min_doc_count": 1 # 为空的话则填充1
"format": "yyyy-MM-dd HH:mm:ss.SSS", // 返回值格式化,HH大写,不然不能区分上午、下午,可以不需要
},
"aggs": {
"3123": {
"sum": {
"field": "layers.frame.frame_frame_len"
}
}
}
}
},
"size": 0,
"query": {
}
}
{
"aggs": {
"2": {
"auto_date_histogram":{
"field":"@timestamp",
"time_zone":"Asia/Hong_Kong",
"buckets":40 #分成多少份
},
"aggs": {
"3": {
"sum": {
"field": "layers.frame.frame_frame_len"
}
}
}
}
},
"size": 0,
"query": {
}
}
"aggregations" : {
"A" : {
"sum" : {
"field" : "A"
}
},
"B" : {
"sum" : {
"field" : "B"
}
},
"(A/B)" : {
"bucket_script" : {
"script" : {
"inline" : "tmpA/tmpB"
},
"buckets_path" : { #bucket_path是一个映射map,用别名映射A和B聚合的桶,然后再在script中做脚本运算,但是es不支持按照聚合生成字段“(A/B)”排序
"tmpA" : "A",
"tmpB" : "B"
}
}
}
}