弹性搜索相当于左连接

时间:2017-06-28 13:15:02

标签: elasticsearch

我在电子商务网站上使用品牌过滤器。即使已经选择了任何品牌,缩进行为仍会显示所有品牌,只有所选项目的所有项目都应过滤。

我的搜索:

"query": {
    "bool": {
        "must": {
            "match": {  
                "text": {
                    "query":"photo"
                }
            }
        },
        "filter": [
          {
            "term": { "brandName": "brodit" }
          }
        ]
    }
},
"aggs": { 
  "Brands": {
    "terms": {
      "field": "brandName"
    }
  }
}

我的意图和我得到的:

enter image description here

我可以看到这种情况正在发生,因为我根据过滤器限制了结果并对过滤后的结果进行了粗略化。

1 个答案:

答案 0 :(得分:1)

更新:执行聚合时,您可以指定要在所有文档中执行聚合。这可以通过将聚合的范围设置为使用Global Bucket来实现。这是您的查询的修改版本。

"query": {
"bool": {
    "must": {
        "match": {  
            "text": {
                "query":"photo"
            }
        }
    },
    "filter": [
      {
        "term": { "brandName": "brodit" }
      }
    ]
  }
},
  "aggs": { 
    "Brands": {
      "global": {},
      "terms": {
        "field": "brandName"
    }
}

}

有关详细信息,请参阅Global Bucket文档的Elasticsearch: Definitive Guide [2.x]部分。

或者,您可以执行两个查询。一个查询不返回任何搜索结果(通过设置大小= 0)以获取您要显示的过滤器选项的品牌聚合。然后,当用户选择要过滤的特定品牌时,您需要执行单独的查询而不进行聚合,以仅在搜索结果中显示属于该品牌的商品。