Es7.x 分组聚合查询

本文介绍如何使用Elasticsearch进行银行数据的聚合分析,通过DSL查询和Java代码实现,具体展示了根据州分组并计算各州平均工资的过程。

DSL查询如下:
在这里插入图片描述
Java代码如下:

public class BankTest extends BaseTests{

    @Autowired
    @Qualifier("elasticsearchTemplate")
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Qualifier("elasticsearchClient")
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void testAgg() throws IOException {
        SearchRequest searchRequest = new SearchRequest("bank");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //根据state.keyword(州)分组,别名为state
        TermsAggregationBuilder state = AggregationBuilders.terms("state").field("state.keyword").size(200);
        //求平均工资
        AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("balance").field("balance");
        //最终聚合结果是:根据州分组,然后求每个州的平均工资
        TermsAggregationBuilder termsAggregationBuilder = state.subAggregation(avgAggregationBuilder);
        searchSourceBuilder.aggregation(termsAggregationBuilder);
        System.out.println("********************************************");
        System.out.println(searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        //下面获得聚合查询
        Aggregations aggregations = search.getAggregations();
        for(Aggregation a:aggregations){
            Terms terms = (Terms) a;
            for(Terms.Bucket bucket:terms.getBuckets()){
                Avg balance = (Avg)bucket.getAggregations().asMap().get("balance");
                double value = balance.getValue();
                System.out.println(bucket.getKeyAsString()+"州的平均工资是"+value);
            }
        }
    }

}
### Elasticsearch 7.x 和 6.x 版本在创建索引方面的差异 Elasticsearch 在版本升级过程中,对索引的创建和管理进行了多项调整。以下是对 Elasticsearch 7.x 和 6.x 在创建索引方面的主要差异: #### 1. 类型(Type)的概念变化 在 Elasticsearch 6.x 中,一个索引可以包含多个类型[^2]。虽然支持单索引多类型结构,但官方已经不建议使用这种方式,并推荐每个索引只包含一个类型。而在 Elasticsearch 7.x 中,这种限制被正式实施,即一个索引只能有一个类型[^2]。这意味着,在 7.x 版本中,`_type` 字段不再具有实际意义,且在未来的版本中可能会完全移除。 #### 2. 索引模板的变更 Elasticsearch 7.x 引入了新的索引模板机制,称为“组件模板”(Component Templates)。与之前的单一模板相比,组件模板允许用户将模板拆分为更小的部分,例如设置映射、别名或配置等,然后通过组合这些部分来创建完整的索引模板[^1]。这使得索引模板的管理和复用更加灵活。 #### 3. 默认分片数量的变化 在 Elasticsearch 6.x 中,默认情况下,每个索引会被分配 5 个主分片和 1 个副本分片。然而,在 Elasticsearch 7.x 中,为了优化资源利用率和性能,默认的主分片数量减少为 1。这一更改旨在减少小型索引的开销,同时提高集群的整体性能。 #### 4. 创建索引时的参数校验 Elasticsearch 7.x 对索引创建时的参数进行了更严格的校验。例如,某些字段名称或映射类型可能在新版本中被视为无效或已废弃。此外,7.x 版本还引入了一些新的限制条件,例如禁止使用动态字段生成嵌套对象等。 #### 5. 索引别名的增强 在 Elasticsearch 7.x 中,索引别名的功能得到了进一步增强。用户可以通过别名直接执行写操作,而无需显式指定底层索引[^3]。这为索引轮换和数据迁移提供了更大的灵活性。 #### 示例代码:创建索引 以下是使用 Elasticsearch 高级客户端在不同版本中创建索引的示例代码: **Elasticsearch 6.x 版本** ```java CreateIndexRequest request = new CreateIndexRequest("my_index"); request.mapping("{ \"type\": { \"properties\": { \"field\": { \"type\": \"text\" } } } }", XContentType.JSON); client.indices().create(request, RequestOptions.DEFAULT); ``` **Elasticsearch 7.x 版本** ```java CreateIndexRequest request = new CreateIndexRequest("my_index"); request.mapping("{ \"properties\": { \"field\": { \"type\": \"text\" } } }", XContentType.JSON); client.indices().create(request, RequestOptions.DEFAULT); ``` 可以看到,在 7.x 版本中,`type` 字段已被移除。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值