祝大家今天愉快。这个问题涉及多方面的搜索。
假设有两个过滤器:
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等于过滤器的数目。
谨致问候
发布于 2019-03-27 13:14:17
假设初始查询为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时,所期望的内容将逐步解释如下:
1.筛选记录
这可以通过在category字段上使用术语查询来实现。现在,如果在聚合之前应用了此查询,则会导致问题中提到的问题。CATEGORIES方面将对Frieght进行计数,其他计数将为零。尽管COLORS方面会有预期的计数。要解决这一问题,我们可以利用过滤器。这将确保在准备聚合之后对记录进行过滤。
这就是它的工作方式:
步骤1: match_all(原始查询)
步骤2:准备聚合
步骤3:应用过滤器(预期的搜索结果)
在此基础上,我们可以得到正确的滤波结果和期望的计数CATEGORIES面,但是COLORS中的计数仍然是相同的,根据CATEGORIES方面的选择,预计会减少。下一步将修复此问题。
2.要相应更改的其他方面的计数()
为了处理这个问题,我们将使用过滤器聚合和实际聚合。我们将将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"
]
}
}
}
}https://stackoverflow.com/questions/55376813
复制相似问题