允许用户在聚合中使用OR

时间:2016-08-12 11:22:52

标签: elasticsearch

我无法通过弹性搜索来生成我想要显示给我的用户的构面/聚合。

TLTR

我不喜欢这个方面在这个网站上的表现: https://mad.coop.dk/frugt-og-groent#!/frugt-og-baer

想象一下我们正在展示待售汽车的搜索页面。汽车的模型如下:

汽车

{
    "brand": "Ford",
    "color": "Blue"
}

编制索引

在索引中添加4辆汽车

POST /agg_analysis/data/_bulk
{ "index": {}}
{ "brand" : "Ford", "color":"Blue" }
{ "index": {}}
{ "brand" : "Ford", "color":"Red" }
{ "index": {}}
{ "brand" : "Toyota", "color":"Blue" }
{ "index": {}}
{ "brand" : "Toyota", "color":"Yellow" }

初始信息

在页面的左侧,我们允许用户过滤汽车

enter image description here

INITIAL QUERY

汇总是直截了当的

GET /agg_analysis/data/_search
{

  "aggs": {
    "brand": {
      "terms": {
        "field": "brand"
      }
    },
    "color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

使用案例1:找到一辆蓝色汽车

用户单击颜色:蓝色小平面,小平面和车辆会相应更新

enter image description here

GET /agg_analysis/data/_search
{
  "query": {
    "term": {
      "color": {
        "value": "blue"
      }
    }
  },
  "aggs": {
    "brand": {
      "terms": {
        "field": "brand"
      }
    },
    "color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

一切都很好,用户很满意

使用案例2:找到蓝色或红色汽车

这就是问题的开始。当用户点击蓝色复选框时,红色复选框消失。

所以我想要的是所有方面都会更新 - 除了用户点击的方面。

使用案例3:找到蓝色或红色汽车,它应该是福特

这有点问题。

1 个答案:

答案 0 :(得分:2)

您只需将查询更改为使用post_filter而不是query,即在整个文档集上计算聚合,然后使用{{1}过滤生成的文档}}。使用post_filter,文档会先前过滤到正在运行的聚合,因此您不再看到所有方面的原因。

query

您还会看到GET /agg_analysis/data/_search { "post_filter": { "term": { "color": { "value": "blue" } } }, "aggs": { "brand": { "filter": { "term": { "color": { "value": "blue" } } }, "aggs": { "terms": { "field": "brand" } } }, "color": { "terms": { "field": "color" } } } } 聚合已过滤为仅显示brand种颜色的品牌。