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
              }
            }
          }
        }
      }
    }
  }
}