ElasticSearch:按字段聚合并按最低价格汇总

时间:2015-11-13 10:34:06

标签: elasticsearch elasticsearch-aggregation

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

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