MST
星途 面试题库

面试题:ElasticSearch计数聚合在复杂嵌套文档结构中的应用

假设有一个ElasticSearch索引,文档结构为多层嵌套,例如一个产品文档,包含产品基本信息、多个子类别以及每个子类别下的多个详细属性。现在需要对每个子类别下具有特定属性值的产品进行计数聚合,应该如何构建查询?请详细说明思路和步骤,并给出实际的查询语句。
36.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

思路和步骤

  1. 了解文档结构:明确多层嵌套结构,确定产品基本信息、子类别及子类别下详细属性在文档中的位置和关系。
  2. 使用Nested查询:因为是多层嵌套结构,需要使用nested查询来深入到嵌套层级。
  3. 过滤特定属性值:在nested查询内部,使用bool查询结合filter子句来过滤出具有特定属性值的文档。
  4. 计数聚合:使用terms聚合来对满足条件的子类别进行分组,然后在每个分组内使用value_count聚合来计数产品数量。

实际查询语句

假设索引名为products,文档结构如下:

{
    "product_info": {
        "product_name": "示例产品"
    },
    "sub_categories": [
        {
            "sub_category_name": "类别1",
            "attributes": [
                {
                    "attribute_name": "属性1",
                    "attribute_value": "特定值"
                }
            ]
        },
        {
            "sub_category_name": "类别2",
            "attributes": [
                {
                    "attribute_name": "属性2",
                    "attribute_value": "其他值"
                }
            ]
        }
    ]
}

查询语句如下:

{
    "aggs": {
        "sub_categories": {
            "nested": {
                "path": "sub_categories"
            },
            "aggs": {
                "filtered_sub_categories": {
                    "filter": {
                        "bool": {
                            "filter": [
                                {
                                    "nested": {
                                        "path": "sub_categories.attributes",
                                        "query": {
                                            "term": {
                                                "sub_categories.attributes.attribute_value": "特定值"
                                            }
                                        }
                                    }
                                }
                            ]
                        }
                    },
                    "aggs": {
                        "group_by_sub_category": {
                            "terms": {
                                "field": "sub_categories.sub_category_name"
                            },
                            "aggs": {
                                "product_count": {
                                    "value_count": {
                                        "field": "_id"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

上述查询语句首先通过nested聚合进入sub_categories嵌套层级,然后在内部通过filter过滤出具有特定属性值的子类别,接着使用terms聚合按子类别名称分组,最后在每个分组内使用value_count聚合统计产品数量。