gpt4 book ai didi

elasticsearch - 如何在 Elasticsearch OR选项中使用术语聚合

转载 作者:行者123 更新时间:2023-12-02 22:17:40 25 4
gpt4 key购买 nike

假设我有以下数据:

car1: { color: blue, brand: mercedes }
car2: { color: blue, brand: toyota }
car3 { color: red, brand: mercedes }
car4: { color: red, brand: toyota }
car5: { color: green,brand: toyota }

“颜色”的汇总给我 { blue: 2, red: 2, green: 1}
“品牌”的汇总给了我 { mercedes: 2, toyota: 3 }
到目前为止很好。

如果我搜索“color = blue”并在过滤后进行汇总,则最终得到:

聚合“颜色”给我 { blue: 2 } //仅适用于蓝色汽车

聚合“品牌”给我 { mercedes: 1, toyota: 1 } //仅适用于蓝色汽车

在搜索中,我可以为每个属性选择多个方面,因此搜索“蓝色”或“红色”或“绿色”汽车将获得所有记录。

因此,我想在过滤相应的属性之前,但在其他属性之后,获取每个聚合值,因此我也可以看到其他金额。

使用后置滤波器不适用于此处(循环引用)。

我真的必须触发多个查询(针对主查询和每个聚合)吗?

还是我必须在后过滤之前使用所有聚合并将所有过滤器(除了相应的过滤器)再次放入每个聚合(filter-aggr。)?

任何帮助表示赞赏!

[一种]
没有过滤器
Color:
( ) blue: 2
( ) red: 2
( ) green: 1
Brand:
( ) toyota: 3
( ) mercedes: 2

[B]
滤镜:颜色=蓝色
Color:
(x) blue: 2
Brand:
( ) toyota: 1
( ) mercedes: 1

[C]
滤镜:颜色=蓝色
Color:
(x) blue: 2
( ) red: 2
( ) green: 1
Brand:
( ) toyota: 1
( ) mercedes: 1

最佳答案

根据所需的上述示例功能中的哪些,以下一些查询将带您到达那里。

例如B:
此查询将仅为您提供整个查询的聚合。第一次在页面加载时运行时,查询部分将没有任何术语,因此您将获得颜色和品牌的完整汇总列表。如果用户选择了蓝色小平面,则查询将仅返回与该小平面匹配的文档。这意味着从该返回集生成的聚合将与示例B中的构面列表匹配。

POST /cars/car/_search
{
"query": {
"term": {
"color": {
"value": "blue"
}
}
},
"aggs" : {
"colors" : {
"terms" : { "field" : "color" }
},
"brands" : {
"terms" : { "field" : "brand" }
}
}
}

范例C:
对于示例C,我相信您的目标是即使执行搜索后,所有潜在的方面都应该可见。为此,您想创建一个使用全局上下文的聚合,以获取所有文档,而不仅仅是查询返回的文档。在此示例中,所有搜索都将返回颜色和品牌方面的完整方面列表。
POST /cars/car/_search
{
"query": {
"term": {
"color": {
"value": "blue"
}
}
},
"aggs" : {
"all_cars" : {
"global": {},
"aggs" : {
"colors" : {
"terms" : { "field" : "color" }
},
"brands" : {
"terms" : { "field" : "brand" }
}
}
}
}
}

如果您的目标是允许用户始终看到所有可用的构面,请确保查询根据用户选择的构面的数量和类型进行调整。

更新:根据下面的注释,这将结合两个选项。您可以通过这种方式获得完整的未过滤的聚集和过滤的聚集。您将必须根据用户的操作以编程方式决定要在显示中使用哪个构面列表。
POST /cars/car/_search
{
"query": {
"term": {
"color": {
"value": "blue"
}
}
},
"aggs" : {
"colors" : {
"terms" : { "field" : "color" }
},
"brands" : {
"terms" : { "field" : "brand" }
},
"all_cars" : {
"global": {},
"aggs" : {
"colors" : {
"terms" : { "field" : "color" }
},
"brands" : {
"terms" : { "field" : "brand" }
}
}
}
}
}

更新2:您还可以嵌套聚合,以便可以通过过滤器预先计算各个方面。
POST /cars/car/_search
{
"aggs" : {
"colors" : {
"terms" : { "field" : "color" },
"aggs" : {
"brandsByColor" : {
"terms" : { "field" : "brand" }
}
}
},
"brands" : {
"terms" : { "field" : "brand" },
"aggs" : {
"colorsByBrand" : {
"terms" : { "field" : "color" }
}
}
}
}
}

关于elasticsearch - 如何在 Elasticsearch OR选项中使用术语聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25031464/

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