0
我想在聚合数据上运行后过滤器,但它不像我期望的那样工作。有人可以查看我的查询,并建议我在这里做错了什么。弹性搜索子集聚后过滤器
"query" : {
"bool" : {
"must" : {
"range" : {
"versionDate" : {
"from" : null,
"to" : "2016-04-22T23:13:50.000Z",
"include_lower" : false,
"include_upper" : true
}
}
}
}
},
"aggregations" : {
"associations" : {
"terms" : {
"field" : "association.id",
"size" : 0,
"order" : {
"_term" : "asc"
}
},
"aggregations" : {
"top" : {
"top_hits" : {
"from" : 0,
"size" : 1,
"_source" : {
"includes" : [ ],
"excludes" : [ ]
},
"sort" : [ {
"versionDate" : {
"order" : "desc"
}
} ]
}
},
"disabledDate" : {
"filter" : {
"missing" : {
"field" : "disabledDate"
}
}
}
}
}
}
}
步骤在查询:
- 通过indexDate过滤小于或等于给定的日期。
- 基于formId的聚合。每个formId形成桶。
- 按降序排序并返回每个存储桶的最高命中结果。
- 运行排序subaggregation后subaggregation过滤器和桶,其中禁用的日期不为空删除所有文件。(这是不工作)
我有一个用例需要在计算聚合时考虑disabledDate!= null的文档。一旦聚合完成,我想用所有的桶中的disabledDate!= null过滤所有文档。所以我试图在聚合完成后执行后过滤器,以返回缺少disabledDate的文档,该文档被禁用== null。 –
在聚合计算完成后,您无法从存储桶中删除任何**。使用查询和过滤器,您只能决定将哪些文档放入聚合管道中,但是一旦聚合计算完毕,您就无法修改这些存储桶。 – Val
感谢您澄清疑问。我的用例是这样的,当我在聚合桶上执行了tophit后,如果一个桶有一个disabledDate!= null的文档,我不想从该桶中返回任何结果。考虑V1被禁用并且与给定时间最接近,它是返回作为tophit。如果我执行后过滤器,则不应该从该桶中返回任何内容。这就是要求。但是,如果我在聚合之前过滤V1文档,那么可能会返回V2,这是距同一个存储桶的给定时间的下一个最接近的文档。我如何实现这一目标?我在SQL中得到了这个工作。 –