spring cloud elasticsearch组合查询,高亮,聚合函数

本文详细介绍了如何在Spring Boot应用中集成Elasticsearch进行数据查询和聚合操作。首先,在pom.xml文件中引入相关依赖,接着创建Account实体类。然后展示了如何进行组合查询,包括匹配查询和高亮显示。再者,文章演示了聚合查询,通过state字段进行分组并计算平均余额。最后提供了更多聚合操作的中文文档链接供读者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装教程参考

https://blog.youkuaiyun.com/u011421988/article/details/115465901

1.在pom文件引入相关的jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.75</version>
 </dependency>

2.创建acount实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    private Long accountNumber;

    private Long balance;

    private String firstname;

    private String lastname;

    private Integer age;

    private String gender;

    private String address;

    private String employer;

    private String email;

    private String city;

    private String state;
}

3.组合查询代码

@SneakyThrows
@Test
void boolSearch() {
    // 指定搜索索引
    SearchRequest searchRequest = new SearchRequest(BANK_INDEX);
    // 组装搜索条件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery("city", "Brogan Dante")));
    //sourceBuilder.query(QueryBuilders.boolQuery()
    //        .must(QueryBuilders.matchQuery("age", 30))
                // 范围查询
    //        .filter(QueryBuilders.rangeQuery("balance").gte(2000).lte(3000))
    //);
    //高亮显示
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("city");
    highlightBuilder.requireFieldMatch(false);
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    sourceBuilder.highlighter(highlightBuilder);

    // 添加搜索数据源
    searchRequest.source(sourceBuilder);
    // 返回结果
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    log.info("searchResponse>>{}", searchResponse);

    SearchHit[] hits = searchResponse.getHits().getHits();
    for (SearchHit hit : hits) {
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        // 获取高亮查询字段
        HighlightField city = highlightFields.get("city");
        Map<String, Object> source = hit.getSourceAsMap();
        //转换成实体方便返回
        Account account = JSON.parseObject(JSON.toJSONString(source), Account.class);
        if (null != city){
            Text[] texts = city.fragments();
            String new_city = "";
            for (Text text : texts) {
                new_city += text;
            }
            account.setCity(new_city);
        }
        log.info("account-->{}", account);
    }
}

4.聚合查询

@SneakyThrows
@Test
void aggregation(){
    SearchRequest searchRequest = new SearchRequest(BANK_INDEX);

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 字符串分组的字段需要加  .keyword 不然会报错
    TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group_by_state")
            .field("state.keyword")
            .size(50)
            .order(BucketOrder.aggregation("average_balance", false))
            // 子集合
            .subAggregation(AggregationBuilders.avg("average_balance").field("balance"));
    sourceBuilder.aggregation(aggregationBuilder);

    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    log.info("searchResponse>>{}", searchResponse);
}

5.更多聚合操作可参考中文文档

https://learnku.com/docs/elasticsearch73/7.3/article-11/6889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值