springboot 整合ES

本文介绍了如何在SpringBoot项目中整合Elasticsearch,详细讲述了从引入依赖、编写配置到执行添加、修改、删除和查询文档的步骤,并强调了官方推荐使用RestClient的方式。在测试部分,还展示了如何进行复杂查询,如搜索address中包含'mill'的人员的年龄分布和平均薪资。

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

springboot整个es有四种方法,分别是TransportClient、RestClient、SpringData-Es、Elasticsearch-SQL。

官方推荐的是RestClient

1 引入依赖

创建SpringBoot工程,引入依赖,在spring-boot-dependencies中所依赖的ES版本位可能不一致,要改掉

<!-- 将依赖版本号改成对应版本 7.4.2 -->
<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.4.2</elasticsearch.version>
</properties>

<!-- Java High Level REST Client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

2 编写配置类

@Configuration
public class RestClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        // 如果有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
        return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
    }
}

3 测试

1.1 添加文档

@Test
public void indexData() throws IOException {
    // IndexRequest
    IndexRequest indexRequest = new IndexRequest("users");
    User user = new User();
    user.setUserName("张三");
    user.setAge(20);
    user.setGender("男");
    String source = JSON.toJSONString(user);
    indexRequest.id("1").source(source, XContentType.JSON);
    // 操作ES
    IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
    System.out.println(indexResponse);

}

1.2 修改文档

@Test
public void updateData() throws IOException {
    // UpdateRequest
    UpdateRequest updateRequest = new UpdateRequest("users", "1");
    User user = new User();
    user.setUserName("李四");
    user.setAge(20);
    user.setGender("女");
    updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
    // 操作ES
    restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
}

1.3 删除文档

@Test
public void delete() throws IOException {
    // DeleteRequest
    DeleteRequest deleteRequest = new DeleteRequest("users", "1");
    // 操作ES
    DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
}

1.4 查询文档

@Test
public void search() throws IOException {
    // SearchRequest
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("users");
	// 构建检索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 分页采用简单的from + size分页,适用数据量小的,了解更多分页方式可自行查阅资料
    //        searchSourceBuilder.from((page - 1) * rows);
    //        searchSourceBuilder.size(rows);
    // 查询所有
    //        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
    // 根据字段匹配
    QueryBuilder queryBuilder = QueryBuilders.matchQuery("userName","李四");
    searchSourceBuilder.query(queryBuilder);
    
    searchRequest.source(searchSourceBuilder);
    // 查询ES
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println("查询结果:" + searchResponse.toString());
    SearchHits hits = searchResponse.getHits();
    // 遍历封装列表对象
    List<User> userList = new ArrayList<>();
    SearchHit[] searchHits = hits.getHits();
    for (SearchHit searchHit : searchHits) {
        userList.add(JSON.parseObject(searchHit.getSourceAsString(), User.class));
    }
    System.out.println(userList);
}

搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资

GET bank/_search
{
  "query": {
    "match": {
      "address": "Mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageAvg": {
      "avg": {
        "field": "age"
      }
    },
    "balanceAvg": {
      "avg": {
        "field": "balance"
      }
    }
  }
}

代码实现

@Test
public void find() throws IOException {
    // 1 创建检索请求
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("bank");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 构造检索条件
    sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
    //AggregationBuilders工具类构建AggregationBuilder
    // 构建第一个聚合条件:按照年龄的值分布
    TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名称
    // 参数为AggregationBuilder
    sourceBuilder.aggregation(agg1);
    // 构建第二个聚合条件:平均薪资
    AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
    sourceBuilder.aggregation(agg2);

    System.out.println("检索条件"+sourceBuilder.toString());

    searchRequest.source(sourceBuilder);

    // 2 执行检索
    SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    // 3 分析响应结果
    System.out.println(response.toString());
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值