聚合编辑

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

有关聚合的完整说明,请参阅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 客户端测试中找到。