Python调用ElasticSearch复合聚合查询报错及请求体排查
Elasticsearch复合聚合查询解析异常排查
错误现象
执行复合聚合查询时先后出现两个解析异常:
- 初始请求报错:
elasticsearch.BadRequestError: BadRequestError(400, 'parsing_exception', 'Expected [START_OBJECT] under [size], but got a [VALUE_NUMBER] in [composite]')
- 调整
size字段位置后报错:
elasticsearch.BadRequestError: BadRequestError(400, 'parsing_exception', 'Expected [START_OBJECT] under [sources], but got a [START_ARRAY] in [composite]')
错误原因
复合聚合的语法结构错误:将聚合类型composite直接作为聚合名称使用,导致Elasticsearch无法正确识别聚合类型,进而解析size和sources字段时出现类型不匹配错误。
正确的复合聚合结构要求:
- 自定义一个聚合名称(如
process_stats_composite)作为aggs的键 - 该键对应的对象中,用
composite指定聚合类型,内部再定义size(数值类型)和sources(数组类型)
修正后的查询请求体
{ "query": { "bool": { "must": [ {"range": {"@timestamp": {"gte": "2024-01-01T00:00:00.000Z", "lte": "2024-01-15T23:59:59.999Z"}}} ], "filter": [ {"terms": {"hostip": ["xxx.xxx.xxx.xxx", "xxx.xxx.xxx.xxx", "xxx.xxx.xxx.xxx"]}}, {"terms": {"processname": ["a.exe", "b.exe", "c.exe"]}} ], "must_not": [] } }, "aggs": { "process_stats_composite": { // 自定义聚合名称 "composite": { // 指定聚合类型为composite "size": 1000, "sources": [ {"date_histogram": {"field": "@timestamp", "calendar_interval": "minute"}}, {"processname": {"terms": {"field": "processname"}}}, {"username": {"terms": {"field": "username"}}}, {"hostip": {"terms": {"field": "hostip"}}}, {"tagging": {"terms": {"field": "tagging"}}} ] } } }, "size": 0 }
说明
- 聚合名称可以根据业务需求自定义,只要符合Elasticsearch的命名规则即可
composite作为聚合类型,必须包含sources(定义复合维度的数组)和可选的size(控制单次返回的聚合桶数量)字段
内容的提问来源于stack exchange,提问作者user2433759
相关产品推荐
相关产品推荐

