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 的依赖,如下:

<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 配置,如下:

spring.elasticsearch.rest.uris= localhost:9200
spring.elasticsearch.rest.username=
spring.elasticsearch.rest.password=

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

定义数据实体

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

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 的增删改查,代码如下:

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 中定义了增删改查的方法,代码如下:

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 的增删改查,代码如下:

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 的增删改查测试,代码如下:

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 实现复杂查询,希望本篇的分享可以帮助到有需要的朋友。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值