python es 聚合查询

记录自己使用到的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": []
		}
	}
}

统计某个字段的出现的次数top10

{
	"aggs": {
		"2": {
			"terms": {
				"field": "layers.ip.ip",
				"order" : { "_count" : "desc" },
				"size": 10
			}
		}
	},
	"size": 0,
	"query": {
	}
}

统计某个字段的总和top10

{
	"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"
       }
     }
   }
 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰码达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值