考虑Article和VariationGroups之间的OneToMany关系。
在ElasticSearch中,每篇文章文档都有一个“variationGroup”字段。
我使用条款聚合按文章文档“variationGroup”字段对结果进行分组 我使用TopHits子聚合来获取每个桶的第一个文档。
如何获得每个变体组的最低价格?如果我在我的术语聚合中使用Min子聚合,则将对与查询匹配的文档计算最低价格。
我想获得可以归入变体组的所有文档的最低价格。
例如,名为“Tshirt with stars”的VariationGroup包含6篇文章。查询“red Tshirt”返回这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
}
}
}
}
}
}
答案 0 :(得分:3)
是的,这是因为聚合仅应用于匹配的文档。您希望使用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
}
}
}
}
}
}
}
}