1

考虑 Articles 和 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
          }
        }
      }
    }
  }
}
4

1 回答 1

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
              }
            }
          }
        }
      }
    }
  }
}
于 2015-11-13T12:29:56.360 回答