说品牌“brand1”和“brand2”被选中,颜色“color1”和“color2”被选中,尺寸“size1”和“size2”被选中。
结果只会显示满足以下所有条件的产品:
- 它的品牌是“brand1”或“brand2”
- 它的颜色是“color1”或“color2”
- 它的大小是“size1”或“size2”
类别 Brand 的聚合结果将在所有产品上进行过滤,使得每个产品都满足以下所有条件:
- 它的颜色是“color1”或“color2”
- 它的大小是“size1”或“size2”
颜色和尺寸类别也是如此。
考虑到所有这些,我们可以创建一个 Elasticsearch 查询请求来提供所有结果以及所有聚合(见下文)。
POST _search
{
"filter": {
"bool": {
"must": [
{
"terms": {
"brand": [
"brand1",
"brand2"
]
}
},
{
"terms": {
"color": [
"color1",
"color2"
]
}
},
{
"terms": {
"size": [
"size1",
"size2"
]
}
}
]
}
},
"aggs": {
"filtered_brand_aggs": {
"filter": {
"bool": {
"must": [
{
"terms": {
"color": [
"color1",
"color2"
]
}
},
{
"terms": {
"size": [
"size1",
"size2"
]
}
}
]
}
},
"aggs": {
"brand_aggs": {
"terms": {
"field": "brand"
}
}
}
},
"filtered_color_aggs": {
"filter": {
"bool": {
"must": [
{
"terms": {
"brand": [
"brand1",
"brand2"
]
}
},
{
"terms": {
"size": [
"size1",
"size2"
]
}
}
]
}
},
"aggs": {
"color_aggs": {
"terms": {
"field": "color"
}
}
}
},
"filtered_size_aggs": {
"filter": {
"bool": {
"must": [
{
"terms": {
"color": [
"color1",
"color2"
]
}
},
{
"terms": {
"brand": [
"brand1",
"brand2"
]
}
}
]
}
},
"aggs": {
"size_aggs": {
"terms": {
"field": "size"
}
}
}
}
}
}
这是最通用的查询。当然,这个查询必须根据过滤器选择进行修改。如果说没有选择品牌过滤器,则品牌字段的所有terms 过滤器都将消失。其他领域也是如此。当没有选择过滤器时,您基本上会得到以下查询:
POST _search
{
"aggs": {
"brand_aggs": {
"terms": {
"field": "brand"
}
},
"color_aggs": {
"terms": {
"field": "color"
}
},
"size_aggs": {
"terms": {
"field": "size"
}
}
}
}
因此,每次过滤器选择发生变化时,都会触发一个新查询并更新结果和聚合。