面试题答案
一键面试思路和步骤
- 了解文档结构:明确多层嵌套结构,确定产品基本信息、子类别及子类别下详细属性在文档中的位置和关系。
- 使用Nested查询:因为是多层嵌套结构,需要使用
nested
查询来深入到嵌套层级。 - 过滤特定属性值:在
nested
查询内部,使用bool
查询结合filter
子句来过滤出具有特定属性值的文档。 - 计数聚合:使用
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
聚合统计产品数量。