我正在使用我们电子商务网站上的品牌过滤器。缩进行为是即使选择了任何品牌,仍然显示所有品牌,只有显示在所选品牌上的项目应该被过滤。
我的搜索结果:
"query": {
"bool": {
"must": {
"match": {
"text": {
"query":"photo"
}
}
},
"filter": [
{
"term": { "brandName": "brodit" }
}
]
}
},
"aggs": {
"Brands": {
"terms": {
"field": "brandName"
}
}
}我的意图和我得到的:

正如我所看到的,这是因为我基于过滤器限制了结果,并对过滤后的结果进行了聚合。
发布于 2017-06-28 21:21:41
更新:在执行聚合时,您可以指定要跨所有文档执行聚合。这可以通过将聚合的范围设置为使用Global Bucket来实现。以下是您的查询的修改版本。
"query": {
"bool": {
"must": {
"match": {
"text": {
"query":"photo"
}
}
},
"filter": [
{
"term": { "brandName": "brodit" }
}
]
}
},
"aggs": {
"Brands": {
"global": {},
"terms": {
"field": "brandName"
}
}}
有关更多详细信息,请参阅Elasticsearch: Definitive Guide [2.x]文档的Global Bucket部分。
或者,您可以执行两个查询。一个不返回搜索结果的查询(通过设置size=0)来获取您的品牌聚合,以供您的过滤器选项显示。然后,当用户选择一个特定的品牌作为过滤依据时,您将需要执行一个单独的查询而不进行聚合,以便在搜索结果中仅显示属于该品牌的商品。
https://stackoverflow.com/questions/44803582
复制相似问题