考虑文章和变体组之间的一对多关系。
在ElasticSearch中,每个文章文档都有一个“variationGroup”字段。
我使用术语汇总将文章文档的字段“variationGroup”按结果分组。
我使用TopHits子聚合来获取每个存储桶的第一个文档。
如何获得每个变体组的最低价格?如果我在术语“汇总”上使用“最小”子汇总,则将在与查询匹配的文档上计算最低价格。
我想获得所有可以归入变体组的文档的最低价格。
例如,名为“带有星星的T恤”的VariationGroup包含6条。查询“红色T恤”返回这6篇文章中的2篇。
我想获得6篇文章的最低价格,而不仅是与查询匹配的2篇文章的最低价格。
在同一通话中甚至可能吗?
这是对应的json:
{
"query": {
"match": {
"name": "red Tshirt"
}
},
"size": 0,
"aggs": {
"variation_groups": {
"terms": {
"field": "variationGroup",
"size": 0
},
"aggs": {
"min_price": {
"min": {
"field": "price"
}
},
"max_price": {
"max": {
"field": "price"
}
},
"top_article": {
"top_hits": {
"size": 1
}
}
}
}
}
}
最佳答案
是的,这是因为汇总仅应用于匹配的文档。您想使用 post_filter
而不是普通查询,这样您的聚合将在所有文档上运行,然后最后只返回red Tshirt
文档。
{
"aggs": {
"variation_groups": {
"terms": {
"field": "variationGroup",
"size": 0
},
"aggs": {
"min_price": {
"min": {
"field": "price"
}
},
"max_price": {
"max": {
"field": "price"
}
},
"top_article": {
"top_hits": {
"size": 1
}
}
}
}
},
"post_filter": { <---- move your query in a post_filter
"query": {
"match": {
"name": "red Tshirt"
}
}
}
}
更新
根据您的评论,我会这样做:
{
"size": 0,
"aggs": {
"variation_groups": {
"terms": {
"field": "variationGroup",
"size": 0
},
"aggs": {
"min_price": {
"min": {
"field": "price"
}
},
"max_price": {
"max": {
"field": "price"
}
},
"top_article": {
"filter": {
"query": {
"match": {
"name": "red Tshirt"
}
}
},
"aggs": {
"top_article": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}
关于elasticsearch - ElasticSearch:按字段分组,按术语汇总和最小价格汇总,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33690723/