聚合

编辑

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

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