【Elasticsearch】post_filter
post_filter是在进行聚合之后,再对最终返回的文档列表做额外过滤,不破坏那份聚合/统计的完整性”**。
也就是说如果在聚合之前进行过滤,然后进行聚合,聚合的内容其实是针对于过滤后的文档进行的,比如如果聚合是求平均分,如果先过滤 那么聚合的时候 针对的就是过滤后的文档进行求平均,而是用post_filter 在聚合之后 针对返回的hits文档过滤 不影响聚合 聚合是针对全部的文档来求平均。
换句话说:
如果不需要聚合/统计——直接把条件写进
bool.filter
或query
里即可,post_filter 完全没必要。只有在既想保留完整聚合,又想对最终列表再砍一刀时,post_filter 才成为“不破坏聚合”的工具。
“在用户已经拿到聚合/统计结果以后,再对最终返回的文档列表做一次额外过滤,而不污染聚合。”
因此:
如果你的场景根本不需要聚合(例如只想搜完就完),直接把条件放到
bool.filter
即可,post_filter 完全多余。只有当你既要用聚合展示全集统计,又要让用户最后点选、切分列表时,post_filter 才派上用场。
所以:
post_filter ≠ 为聚合而生,它只是“不破坏聚合”的一种过滤手段。
post_filter 只过滤最终返回的 hits,完全不碰聚合(aggs)的数据范围;聚合仍然基于 query + filter 阶段后的全集来计算。