大家好。问题涉及多面搜索。
假设有2个过滤器:
2.1类别 货运(1765) 汽车(1566) 其他(8675)
2.2种颜色 红色(5689) 绿色(156) 蓝色(3599) 黄色(2562)
正如我们在每个过滤器前面看到的那样,它指示了弹性中分别存储了多少个元素。 在“运费”前面打勾。
现在的行为:
2.1类别 货运(1765) 汽车(0) 还有(0)
2.2种颜色 红色(红色货号) 绿色(绿色货运数量) 蓝色(蓝色货运数量) 黄色(黄色货运数量)
您需要这种行为:
2.1类别 货运(1765) 汽车(1566) 其他(8675)
2.2种颜色 红色(红色货号) 绿色(绿色货运数量) 蓝色(蓝色货运数量) 黄色(黄色货运数量)
也就是说,特定字段上的过滤器不会影响其聚合,但会影响所有其他过滤器。如何实现优化?现在实现了x个请求弹性,并且x等于过滤器数量
最美好的祝愿
答案 0 :(得分:0)
假设初始查询为match_all
,则查询
2.1分类货运(1765)汽车(1566)其他(8675)
2.2颜色红色(5689)绿色(156)蓝色(3599)黄色(2562)
将是:
{
"query": {
"match_all": {}
},
"aggs": {
"CATEGORIES": {
"terms": {
"field": "category"
}
},
"COLORS": {
"terms": {
"field": "color"
}
}
}
}
当选择 Freight
时,期望的解释如下:
这可以通过在category
字段上查询字词来实现。现在,如果在聚合之前应用此查询,则会导致问题中提到的问题。 CATEGORIES
方面将与Frieght
相对,而其他计数将为零。尽管COLORS
方面将具有预期的计数。为了解决这个问题,我们可以使用post_filter。这样可以确保在准备汇总后对记录进行过滤。
这是它的工作方式:
步骤1: match_all(原始查询)
步骤2:准备汇总
第3步:应用过滤器(预期的搜索结果)
通过上述操作,我们将获得正确的过滤结果和预期的数量CATEGORIES
,但是COLORS
中的数量仍然相同,根据CATEGORIES
中的选择,预计数量会减少方面。下一步可以解决此问题。
为解决这个问题,我们将过滤器聚合与实际聚合一起使用。我们将在应进行计数的其余每个聚合中应用post_filter,即除CATEGORIES
以外的所有聚合(在我们的情况下仅为COLORS
。
结合以上两个步骤,查询将是:
{
"query": {
"match_all": {}
},
"aggs": {
"CATEGORIES": {
"terms": {
"field": "category"
}
},
"COLORS": {
"filter": {
"terms": {
"category": [
"Freight"
]
},
"aggs": {
"COLORS": {
"terms": {
"field": "color"
}
}
}
}
},
"post_filter": {
"terms": {
"category": [
"Freight"
]
}
}
}
}