多字段聚合查询在Elasticsearch中的实践

Elasticsearch是一个功能强大的搜索引擎,它不仅支持全文搜索,还提供了丰富的聚合功能。聚合可以帮助我们对数据进行分组和统计,从而得到有意义的分析结果。本文将通过Java代码示例,介绍如何在Elasticsearch中实现多字段的聚合查询。

环境准备

在开始之前,请确保你已经安装了Elasticsearch服务,并且Java开发环境已经搭建好。同时,需要添加Elasticsearch的Java客户端依赖到你的项目中。

xml 复制代码
<!-- 在pom.xml中添加依赖 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.15.0</version> <!-- 使用最新的稳定版本 -->
</dependency>

多字段聚合查询

概念解释

多字段聚合允许我们在一个聚合查询中对多个字段执行相同的聚合操作,例如,我们可以同时对brandcitystarName字段执行术语聚合。

Java代码实现

以下是使用Java代码和RestHighLevelClient进行多字段聚合查询的示例:

java 复制代码
@Test
void testAggs() throws IOException {
    // 创建一个搜索请求,指定索引名为"hotel"
    SearchRequest searchRequest = new SearchRequest("hotel");
    // 构建搜索源,设置不需要原始文档(大小为0)
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);

    // 添加多个术语聚合
    searchSourceBuilder.aggregation(
        AggregationBuilders.terms("brand_agg").field("brand").size(20)
    );
    searchSourceBuilder.aggregation(
        AggregationBuilders.terms("city_agg").field("city").size(20)
    );
    searchSourceBuilder.aggregation(
        AggregationBuilders.terms("star_agg").field("starName").size(20)
    );

    // 将构建的搜索源设置到搜索请求中
    searchRequest.source(searchSourceBuilder);

    // 执行搜索请求,获取搜索响应
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    // 从搜索响应中获取聚合结果
    Aggregations aggregations = searchResponse.getAggregations();

    // 检查聚合结果是否为空
    if (aggregations != null) {
        // 获取并打印不同字段的聚合结果
        printAggregation(aggregations, "brand_agg");
        printAggregation(aggregations, "city_agg");
        printAggregation(aggregations, "star_agg");
    }
}

private void printAggregation(Aggregations aggregations, String aggName) {
    // 根据聚合名称获取特定的聚合结果
    Terms terms = aggregations.get(aggName);
    // 遍历每个桶
    for (Terms.Bucket bucket : terms.getBuckets()) {
        // 获取桶的键(即聚合字段的值)
        String key = bucket.getKeyAsString();
        // 获取该桶的文档计数
        long docCount = bucket.getDocCount();
        // 打印结果
        System.out.println(aggName + " -> " + key + " : " + docCount);
    }
}

结果解析

在上述代码中,我们首先创建了一个SearchRequest对象,并指定了索引名为hotel。然后,我们构建了一个SearchSourceBuilder对象,并使用.size(0)设置不需要返回原始文档。接着,我们添加了三个不同的术语聚合:brand_aggcity_aggstar_agg,分别对应于brandcitystarName字段。

执行搜索请求后,我们从响应中获取聚合结果,并使用printAggregation方法打印每个聚合的结果。这个方法接受聚合结果和聚合名称作为参数,遍历每个桶并打印出桶的键和文档计数。

总结

通过本文的示例,我们学习了如何在Elasticsearch中使用Java的RestHighLevelClient进行多字段聚合查询。这种技术可以应用于各种数据分析场景,帮助我们快速获取数据的分布情况。希望本文能够帮助你更好地理解和使用Elasticsearch的聚合功能。

相关推荐
Elasticsearch5 小时前
使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
elasticsearch
Red丶哞11 小时前
Stitching Together Multiple Input and Output Plugins
elasticsearch
2401_8979300617 小时前
Kibana 连接 Elasticsearch(8.11.3)教程
大数据·elasticsearch·jenkins
Elastic 中国社区官方博客1 天前
Elasticsearch:使用机器学习生成筛选器和分类标签
大数据·人工智能·elasticsearch·机器学习·搜索引擎·ai·分类
Elasticsearch2 天前
Elasticsearch:使用机器学习生成筛选器和分类标签
elasticsearch
浮尘笔记2 天前
go-zero使用elasticsearch踩坑记:时间存储和展示问题
大数据·elasticsearch·golang·go
unhurried人生——冕临2 天前
Ubuntu安装Elasticsearch
elasticsearch
这个懒人3 天前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
愿你天黑有灯下雨有伞3 天前
Docker 安装 Elasticsearch 教程
运维·elasticsearch·docker
遇到困难睡大觉哈哈3 天前
Git推送错误解决方案:`rejected -> master (fetch first)`
大数据·git·elasticsearch