Elasticsearch嵌套字段shift日期过滤后类型聚合异常问题咨询
问题原因
你的排班类型聚合返回全量数据是两个问题共同导致的:
- 你没有把日期过滤条件作用到nested类型的shifts聚合上下文里,nested聚合默认会统计该员工下所有的排班记录,不会自动继承query里针对nested字段的过滤条件
- 你把日期过滤放在query的should子句里,即使加上
minimum_should_match=1也会导致没有符合日期排班的员工被过滤掉,不符合你要返回所有员工的需求
解决方案
调整聚合逻辑,把日期范围过滤放到nested聚合内部作为过滤条件,既不影响外层返回全量员工,又能让排班类型聚合仅统计符合日期范围的排班:
修改后的完整查询如下:
{ "aggs": { "shifts.ref_type": { "nested": { "path": "shifts" }, "aggs": { "filtered_shifts": { "filter": { "range": { "shifts.date_from": { "lte": 1636923600, "gte": 1636318800 } } }, "aggs": { "shifts.ref_type": { "terms": { "field": "shifts.ref_type", "size": 1000 } } } } } }, "role": { "terms": { "field": "role", "size": 1000 } }, "name": { "terms": { "field": "name", "size": 1000 } } }, "query": { "bool": { "must": [ { "term": { "_routing": "1" } } ] } }, "sort": [ { "created": "ASC" } ], "size": 1 }
调整说明
- 移除了query中should子句的冗余日期过滤,避免影响全量员工的返回逻辑
- 在nested的shifts聚合下新增了
filtered_shifts过滤聚合,把日期范围过滤放在该层,仅统计符合时间要求的排班记录 - 调整后的排班类型聚合结果会放在
aggregations.shifts.ref_type.filtered_shifts.shifts.ref_type下,仅包含指定时间范围内的排班类型统计
内容的提问来源于stack exchange,提问作者user807964
相关产品推荐
相关产品推荐

