ElasticSearch:嵌套字段按日期范围聚合求和返回0,求排查修正
ElasticSearch嵌套聚合问题:按国家分组统计指定日期范围内广告点击量总和
我在ElasticSearch中有一个存储广告多维度日期拆分统计数据的索引,每个文档包含广告活跃日期的统计信息。需要创建一个聚合,按国家名称分组,对指定日期范围内的广告点击量求和。
文档示例
{ "_index" : "ads_statistics", "_type" : "_doc", "_id" : "GKfumIMBQ_B0VJNY8PsU", "_score" : 9.962151, "_source" : { "statistics_by_date" : [ { "date" : "2022-08-09 00:00:00", "countries" : [ { "name" : "USA", "clicks" : 901 }, { "name" : "FR", "clicks" : 250 } ] }, { "date" : "2022-08-10 00:00:00", "countries" : [ { "name" : "USA", "clicks" : 825 }, { "name" : "FR", "clicks" : 411 } ] }, { "date" : "2022-08-11 00:00:00", "countries" : [ { "name" : "USA", "clicks" : 523 }, { "name" : "CZ", "clicks" : 23 } ] } ] } }
错误查询语句
我编写了如下查询,但聚合结果返回0:
{ "aggs": { "statistics_by_country": { "nested": { "path": "statistics_by_date.countries" }, "aggs": { "country_terms": { "terms": { "field": "statistics_by_date.countries.name.keyword" }, "aggs": { "filter": { "filter": { "range": { "statistics_by_date.date": { "gte": "2022-08-10", "lte": "2022-08-11" } } }, "aggs": { "total_clicks": { "sum": { "field": "statistics_by_date.countries.clicks" } } } } } } } } } }
错误返回结果
{ "aggregations" : { "statistics_by_country" : { "doc_count" : 189, "country_terms" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 129, "buckets" : [ { "key" : "USA", "doc_count" : 3, "filter" : { "doc_count" : 0, "total_clicks" : { "value" : 0.0 } } }, { "key" : "FR", "doc_count" : 2, "filter" : { "doc_count" : 0, "total_clicks" : { "value" : 0.0 } } }, { "key" : "CZ", "doc_count" : 1, "filter" : { "doc_count" : 0, "total_clicks" : { "value" : 0.0 } } } ] } } } }
备注
- statistics_by_date.countries和statistics_by_date在文档映射中为nested类型
- statistics_by_date.date为date类型
期望结果(2022-08-10至2022-08-11)
- USA : 825 + 523 = 1348
- FR : 411
- CZ : 23
问题原因及解决方案
问题原因
你的聚合层级逻辑错误:直接进入了statistics_by_date.countries嵌套层级,但date字段属于外层的statistics_by_date嵌套对象,在countries层级无法直接关联过滤外层的date值,导致过滤条件完全不匹配,最终求和结果为0。
正确查询写法
需要先通过nested聚合进入statistics_by_date层级,先过滤符合日期范围的条目,再在过滤后的结果里进入countries嵌套层级做分组和求和:
{ "aggs": { "filter_date_range": { "nested": { "path": "statistics_by_date" }, "aggs": { "date_filter": { "filter": { "range": { "statistics_by_date.date": { "gte": "2022-08-10", "lte": "2022-08-11" } } }, "aggs": { "countries_nested": { "nested": { "path": "statistics_by_date.countries" }, "aggs": { "country_terms": { "terms": { "field": "statistics_by_date.countries.name.keyword" }, "aggs": { "total_clicks": { "sum": { "field": "statistics_by_date.countries.clicks" } } } } } } } } } } } }
结果说明
这个查询会先筛选出指定日期范围内的statistics_by_date条目,再针对这些条目下的国家数据进行分组,最终计算出每个国家的点击量总和,完全匹配你期望的结果。
内容的提问来源于stack exchange,提问作者Shani Elkalay
相关产品推荐
相关产品推荐

