聚合

编辑

聚合将您的数据汇总为指标、统计数据或其他分析。

有关聚合的完整说明,请参阅 Elasticsearch 文档

一个简单的聚合

编辑

在下面的示例中,我们运行一个聚合,该聚合从产品索引中创建一个价格直方图,针对名称与用户提供的文本匹配的产品。为了实现这一点,我们使用一个包含查询(在 搜索文档 中进行了解释)和聚合定义的搜索请求。

此示例是一种分析类型的聚合,我们不希望使用匹配的文档。用于分析的搜索请求的通用模式是将结果 size 设置为零,并将搜索结果的目标类设置为 Void

如果将相同的聚合用于显示产品和作为向下钻取构面的价格直方图,我们将把 size 设置为非零值,并使用 Product 作为目标类来处理结果。

String searchText = "bike";

Query query = MatchQuery.of(m -> m
    .field("name")
    .query(searchText)
)._toQuery();

SearchResponse<Void> response = esClient.search(b -> b
    .index("products")
    .size(0) 
    .query(query) 
    .aggregations("price-histogram", a -> a 
        .histogram(h -> h 
            .field("price")
            .interval(50.0)
        )
    ),
    Void.class 
);

将匹配文档的数量设置为零,因为我们只使用价格直方图。

设置用于过滤要运行聚合的产品的查询

创建一个名为“price-histogram”的聚合。您可以根据需要添加任意数量的命名聚合。

选择 histogram 聚合变体。

我们不关心匹配项(size 设置为零),使用 Void 将忽略响应中的任何文档。

响应包含请求中每个聚合的聚合结果。

List<HistogramBucket> buckets = response.aggregations()
    .get("price-histogram") 
    .histogram() 
    .buckets().array(); 

for (HistogramBucket bucket: buckets) {
    logger.info("There are " + bucket.docCount() +
        " bikes under " + bucket.key());
}

获取“price-histogram”聚合的结果。

将其向下转换为 histogram 变体结果。这必须与聚合定义一致。

存储桶可以表示为数组或映射。这将向下转换为数组变体(默认值)。

上面示例的源代码可以在 Java API 客户端测试 中找到。