我无法通过弹性搜索来生成我想要显示给我的用户的构面/聚合。
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" }
初始信息
在页面的左侧,我们允许用户过滤汽车
INITIAL QUERY
汇总是直截了当的
GET /agg_analysis/data/_search
{
"aggs": {
"brand": {
"terms": {
"field": "brand"
}
},
"color": {
"terms": {
"field": "color"
}
}
}
}
使用案例1:找到一辆蓝色汽车
用户单击颜色:蓝色小平面,小平面和车辆会相应更新
GET /agg_analysis/data/_search
{
"query": {
"term": {
"color": {
"value": "blue"
}
}
},
"aggs": {
"brand": {
"terms": {
"field": "brand"
}
},
"color": {
"terms": {
"field": "color"
}
}
}
}
一切都很好,用户很满意
使用案例2:找到蓝色或红色汽车
这就是问题的开始。当用户点击蓝色复选框时,红色复选框消失。
所以我想要的是所有方面都会更新 - 除了用户点击的方面。
使用案例3:找到蓝色或红色汽车,它应该是福特
这有点问题。
答案 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
种颜色的品牌。