MST

星途 面试题库

面试题:ElasticSearch中post_filter与聚合的协同工作

在一个包含多维度聚合(如按类别、时间等聚合)的ElasticSearch查询中,如何合理地运用post_filter来确保聚合结果不受过滤条件影响,但最终返回的文档集符合过滤要求?请给出具体的查询示例,并解释每一步的作用。
42.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 查询示例
{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "category": "electronics"
                    }
                }
            ]
        }
    },
    "aggs": {
        "by_category": {
            "terms": {
                "field": "category"
            }
        },
        "by_date": {
            "date_histogram": {
                "field": "date",
                "calendar_interval": "month"
            }
        }
    },
    "post_filter": {
        "term": {
            "brand": "Apple"
        }
    }
}
  1. 步骤解释
    • query.bool.filter部分
      • 这里的filter用于在执行聚合之前对文档进行初步过滤。在示例中,通过term查询筛选出categoryelectronics的文档。这一步会影响聚合操作,因为聚合是基于经过此过滤后的文档集进行的。
    • aggs部分
      • by_category聚合:使用terms聚合按category字段对文档进行分组,统计每个类别的文档数量等聚合信息。由于前面filter已经筛选出categoryelectronics的文档,所以这里聚合结果会基于这部分文档。
      • by_date聚合:使用date_histogram聚合按date字段,以每月为间隔对文档进行聚合,同样基于经过前面filter筛选后的文档。
    • post_filter部分
      • post_filter中的term查询筛选出brandApple的文档。这一步骤不会影响前面的聚合操作,聚合结果仍然是基于query.bool.filter过滤后的文档集。而最终返回给用户的文档集是经过post_filter再次过滤后的结果,确保最终返回的文档符合brandApple的要求,同时聚合结果不受此post_filter条件影响。