Spring Boot 集成 Elasticsearch【实战】

前言:

上一篇我们简单分享了 Elasticsearch 的一些概念性的知识,本篇我们来分享 Elasticsearch 的实际运用,也就是在 Spring Booot 项目中使用 Elasticsearch。

Elasticsearch 系列文章传送门

Elasticsearch 基础篇【ES】

Elasticsearch Windows 环境安装

Elasticsearch 之 ElasticsearchRestTemplate 普通查询

Elasticsearch 之 ElasticsearchRestTemplate 聚合查询

Elasticsearch 之 ElasticsearchRestTemplate 嵌套聚合查询【嵌套文档聚合查询】

Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】

引入 Elasticsearch 依赖

Spring Boot 集成 Elasticsearch 的第一步就是引入 Elasticsearch 的依赖,如下:

xml 复制代码
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.4.5</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
	<version>2.6.0</version>
</dependency>

配置文件配置

在 properties 文件中进行 Elasticsearch 配置,如下:

yaml 复制代码
spring.elasticsearch.rest.uris= localhost:9200
spring.elasticsearch.rest.username=
spring.elasticsearch.rest.password=

我这里没有配置账号密码,因此账号密码为空。

定义数据实体

我这里使用一个用户 User 对象进行一个简单的实体定义,代码如下:

java 复制代码
package com.order.service.entity.elasticsearch;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

/**
 * @ClassName: elasticsearch
 * @Author: Author
 * @Date: 2024/12/22 19:25
 * @Description:
 */
@Data
@Document(indexName = "user")
public class UserDO {

    @Id
    private int id;
    
    
    private String userName;
    
    
    private int age;

}

Repository 定义

这里我们先采用继承 ElasticsearchRepository 接口的方式完成 Elasticsearch 的增删改查,代码如下:

java 复制代码
package com.order.service.mapper;

import com.order.service.entity.elasticsearch.UserDO;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * @ClassName: ElasticsearchUserMapper
 * @Author: Author
 * @Date: 2024/12/22 19:33
 * @Description:
 */
public interface ElasticsearchUserRepository extends ElasticsearchRepository<UserDO,String> {


}

Service 定义

我们在 Service 中定义了增删改查的方法,代码如下:

java 复制代码
package com.order.service.service;

import com.order.service.entity.elasticsearch.UserDO;

import java.util.List;

/**
 * @ClassName: ElasticsearchService
 * @Author: Author
 * @Date: 2024/12/22 19:27
 * @Description:
 */
public interface ElasticsearchService {


    /**
     * @param userDO:
     * @date 2024/12/19 10:39
     * @description 保存用户
     */
    void saveUser(UserDO userDO);

    /**
     * @param id:
     * @return com.order.service.entity.elasticsearch.UserDO
     * @date 2024/12/23 19:39
     * @description 查询用户
     */
    UserDO queryUserById(int id);

    /**
     * @date 2024/12/23 19:40
     * @description 更新用户
     */
    void updateUser(UserDO userDO);

    /**
     * @param id:
     * @author Author
     * @date 2024/12/19 10:41
     * @description 删除用户
     */
    void deleteUserById(int id);

    /**
     * @return java.util.List<com.order.service.entity.elasticsearch.UserDO>
     * @author Author
     * @date 2024/12/23 19:42
     * @description 查询所有用户
     */
    List<UserDO> queryAllUser();


}

ServiceImpl 定义

我们在 ServiceImpl 中定义了实现了 Service 的增删改查的方法,通过注入 ElasticsearchUserRepository 的方式完成了 Elasticsearch 的增删改查,代码如下:

java 复制代码
package com.order.service.service.impl;

import com.order.service.entity.elasticsearch.UserDO;
import com.order.service.mapper.ElasticsearchUserRepository;
import com.order.service.service.ElasticsearchService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @ClassName: ElasticsearchServiceImpl
 * @Author: Author
 * @Date: 2024/12/22 19:34
 * @Description:
 */
@Slf4j
@Service
public class ElasticsearchServiceImpl implements ElasticsearchService {

    @Autowired
    private ElasticsearchUserRepository elasticsearchUserRepository;

    @Override
    public void saveUser(UserDO userDO) {
        elasticsearchUserRepository.save(userDO);
    }

    @Override
    public UserDO queryUserById(int id) {
        Optional<UserDO> optional = elasticsearchUserRepository.findById(String.valueOf(id));
        return optional.get();
    }

    @Override
    public void updateUser(UserDO userDO) {
        elasticsearchUserRepository.save(userDO);
    }

    @Override
    public void deleteUserById(int id) {
        elasticsearchUserRepository.deleteById(String.valueOf(id));
    }

    @Override
    public List<UserDO> queryAllUser() {
        Iterable<UserDO> all = elasticsearchUserRepository.findAll();
        List<UserDO> userList = new ArrayList<>();
        for (UserDO userDO : all) {
            userList.add(userDO);
        }
        return userList;
    }
}

Controller 定义

我们在 Controller 的方式完成 Elasticsearch 的增删改查测试,代码如下:

java 复制代码
package com.order.service.controller;

import com.order.service.entity.elasticsearch.UserDO;
import com.order.service.service.ElasticsearchService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @ClassName: ElasticsearchContorller
 * @Author: Author
 * @Date: 2024/12/22 19:26
 * @Description:
 */
@Slf4j
@RestController
public class ElasticsearchController {

    @Autowired
    private ElasticsearchService elasticsearchService;

    @PostMapping("/save-user")
    public String saveUser(@RequestBody UserDO userDO) {
        elasticsearchService.saveUser(userDO);
        return "success";
    }

    @GetMapping("/query-user-by-id")
    public UserDO queryUserById(@RequestParam int id) {
        return elasticsearchService.queryUserById(id);
    }

    @PostMapping("/update-user")
    public String updateUser(@RequestBody UserDO userDO) {
        elasticsearchService.updateUser(userDO);
        return "success";
    }

    @GetMapping("/detele-user-by-id")
    public String deleteUserById(@RequestParam int id) {
        elasticsearchService.deleteUserById(id);
        return "success";
    }

    @GetMapping("/query-all-user")
    public List<UserDO> queryUserById() {
        return elasticsearchService.queryAllUser();
    }

}

Elasticsearch 增删改查测试

新增用户测试,如下:

正常写入了,结果符合预取,下面我们试试查询。

查询用户测试,如下:

查询到了我们各个新增的用户,结果符合预期,下面我们来试试更新用户信息。

更新用户测试,如下:

更新用户信息成功,我们再次查询该用户信息,看看是否真的更新成功了。

再次查询用户信息如下:

可以看到用户的姓名和年龄都发生了变更,表示我们更新成功了,结果符合预期。

删除用户测试,如下:

删除用户信息成功,我们再次查询该用户信息,看看是否真的删除成功了。

再次查询用户信息如下:

可以看到没有查询到用户信息表名息删除成功。

查询所有用户测试,如下:

可以看到返回了一个用户信息列表,结果符合预期。

总结:可以看到我们使用 ElasticsearchRepository(也就是 JPA) 进程 Elasticsearch 的数据增删改查就像使用 MySQL 一样简单,但我在尝试使用较为复杂的查询的时候,ElasticsearchRepository 相关的方法提示已经过期,下一篇我们将分享使用 ElasticsearchRestTemplate 实现复杂查询,希望本篇的分享可以帮助到有需要的朋友。

如有不正确的地方欢迎各位指出纠正。

相关推荐
SizeTheMoment26 分钟前
SpringBoot快速上手
java·spring boot·后端
时序数据说1 小时前
分布式集群中的共识算法及其在时序数据库IoTDB中的应用
大数据·数据库·分布式·开源·时序数据库·iotdb·共识算法
简诚1 小时前
redis在spring boot中异常退出
spring boot·redis
RUZHUA1 小时前
小米汽车二期工厂下月将竣工,产能提升助力市场拓展
大数据·人工智能·汽车
wuli玉shell1 小时前
Hadoop-HDFS-Packet含义及作用
大数据·hadoop·hdfs
Uranus^2 小时前
深入解析Spring Boot与Redis的缓存集成实践
java·spring boot·redis·缓存·性能优化
zhongtianhulian3 小时前
中天智能装备科技有限公司:智能仓储领域的卓越之选
大数据·人工智能·科技
sg_knight8 小时前
Docker网络全景解析:Overlay与Macvlan深度实践,直通Service Mesh集成核心
java·网络·spring boot·spring cloud·docker·容器·service_mesh