gpt4 book ai didi

elasticsearch - 如何处理方面筛选和相应的聚合计数?

转载 作者:行者123 更新时间:2023-12-03 01:31:57 32 4
gpt4 key购买 nike

祝大家有美好的一天。问题涉及多面搜索。

假设有两个过滤器:

2.1分类
cargo (1765)
汽车(1566)
其他(8675)

2.2颜色
红色(5689)
绿色(156)
蓝色(3599)
黄色(2562)

正如我们在每个过滤器前面看到的那样,它指示了 flex 中分别存储了多少个元素。
在“运费”前面打勾。

现在的行为:

2.1分类
cargo (1765)
汽车(0)
再有(0)

2.2颜色
红色(红色货号)
绿色(绿色 cargo 数量)
蓝色(蓝色 cargo 数量)
黄色(黄色 cargo 数量)

您需要以下行为:

2.1分类
cargo (1765)
汽车(1566)
其他(8675)

2.2颜色
红色(红色货号)
绿色(绿色 cargo 数量)
蓝色(蓝色 cargo 数量)
黄色(黄色 cargo 数量)

也就是说,特定字段上的过滤器不会影响其聚合,但会影响所有其他过滤器。如何实现优化呢?现在实现了x个请求 flex ,并且x等于过滤器数

最好的祝愿

最佳答案

假设初始查询为match_all,则查询

2.1 Categories Freight (1765) Cars (1566) Any other (8675)

2.2 Colors Red (5689) Green (156) Blue (3599) Yellow (2562)


将会:
{
"query": {
"match_all": {}
},
"aggs": {
"CATEGORIES": {
"terms": {
"field": "category"
}
},
"COLORS": {
"terms": {
"field": "color"
}
}
}
}
当选择 Freight 什么期望通过步骤如下所述的步骤:
1.过滤记录
这可以通过在 category字段上查询字词来实现。现在,如果在聚合之前应用此查询,则会导致问题中提到的问题。 CATEGORIES构面将针对 Frieght进行计数,而其他计数将为零。尽管 COLORS构面将具有预期的计数。为了解决这个问题,我们可以使用 post_filter。这将确保在准备聚合之后对记录进行过滤。
它是这样工作的:
步骤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"
]
}
}
}
}

关于elasticsearch - 如何处理方面筛选和相应的聚合计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55376813/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com