ElasticSearch:按字段分组并按最低价格聚合
ElasticSearch : Group by field with Terms aggregation and aggregate on Min price
考虑 Articles 和 VariationGroups 之间的 OneToMany 关系。
在 ElasticSearch 中,每个文章文档都有一个 "variationGroup" 字段。
我使用 Terms 聚合按文章文档的字段 "variationGroup" 对结果进行分组。
我使用 TopHits 子聚合来获取每个存储桶的第一个文档。
如何获得每个变体组的最低价格?如果我在我的术语聚合中使用最小子聚合,则将在与查询匹配的文档上计算最低价格。
我想获得可以归入一个变体组的所有文档的最低价格。
例如,名为 "Tshirt with stars" 的 VariationGroup 包含 6 篇文章。查询 "red Tshirt" returns 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
}
}
}
}
}
}
}
}
考虑 Articles 和 VariationGroups 之间的 OneToMany 关系。
在 ElasticSearch 中,每个文章文档都有一个 "variationGroup" 字段。
我使用 Terms 聚合按文章文档的字段 "variationGroup" 对结果进行分组。
我使用 TopHits 子聚合来获取每个存储桶的第一个文档。
如何获得每个变体组的最低价格?如果我在我的术语聚合中使用最小子聚合,则将在与查询匹配的文档上计算最低价格。
我想获得可以归入一个变体组的所有文档的最低价格。
例如,名为 "Tshirt with stars" 的 VariationGroup 包含 6 篇文章。查询 "red Tshirt" returns 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
}
}
}
}
}
}
}
}