java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引

首先 pom.xml导入依赖

xml 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

application配置文件中编写如下配置

spring.elasticsearch.hosts: 172.16.5.10:9200

我这里是用的yml格式的

javascript 复制代码
spring:
  elasticsearch:
    hosts: http://localhost:9200

告诉它指向 我们本地的 9200服务

然后 我们在启动类同目录下 创建一个叫 domain的包 放属性类

然后在这个包下创建一个叫 books的类

参考代码如下

java 复制代码
package com.example.webdom.domain;

import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.stereotype.Component;

@Component
@Document(indexName = "books")
public class books {
    private String id;
    private String type;
    private String name;
    private String describe;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public String getDescribe() {
        return describe;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDescribe(String describe) {
        this.describe = describe;
    }

    @Override
    public String toString() {
        return "books{" +
                "id='" + id + '\'' +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + describe + '\'' +
                '}';
    }
}

这里 我们就定义了几个属性 声明get set函数 然后 为了不免错误 我们id直接给了个字符串类型

重写了toString 让大家能够更直观的看到属性

然后 Document 的indexName 告诉程序 我们要用的是哪一个索引 这里我们给了个 books 表示操作books 索引

然后 我们创建一个Mapper接口 这里 我们直接就叫 BooksMapper

接口代码如下

java 复制代码
package com.example.webdom.service;

import com.example.webdom.domain.books;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BoooksMaaper extends ElasticsearchRepository<books,String> {
}

它需要继承 ElasticsearchRepository 操作ES的一个接口 然后通过 Repository 将它加到spring容器中

然后 我们在启动类同目录下的 config 包 没有就建一个 下面创建一个类 叫 ESClientConfig 名字无所谓

然后 编写代码如下

java 复制代码
package com.example.webdom.config;

import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClientBuilder;

@Configuration
public class ESClientConfig {

    @Autowired
    private Environment environment;

    @Bean
    public RestHighLevelClient elasticsearchClient() {
        String elasticsearchHosts = environment.getProperty("spring.elasticsearch.hosts");
        RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchHosts));
        // 设置其他配置,如认证信息、连接超时等
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
}

然后 我们在测试类 中将这个接口条件装配进来

测试类代码编写如下

java 复制代码
package com.example.webdom;

import com.example.webdom.domain.books;
import com.example.webdom.service.BoooksMaaper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class WebDomApplicationTests {

    @Autowired
    private BoooksMaaper BoooksMaaper;

    @Test
    void set() {
        books bookdai = new books();
        bookdai.setId("1");
        bookdai.setType("爱猫当的自我修改样");
        bookdai.setName("爱护猫猫");
        bookdai.setDescribe("帮助所有爱猫当快速了解猫猫");
        books book = BoooksMaaper.save(bookdai);
        System.out.println(book);
    }
}

这里 我们条件装配了自己写的接口 BoooksMaaper

然后 books实体类 new出来 然后 用set方法给每一个字段赋值

最后调用 save 添加方法 它有一个返回值 就是我们的属性类实体对象

我们右键运行

此时 我们就运行成功了 然后 可以看到 save 返回的这个对象 就是我们添加进去的东西了

然后 我们通过请求查询一下 books索引下面的文档

http://localhost:9200/books/_search get

就会看到 这里确实是进来了

然后呢 这个东西的修改比较有意思

我们还是这样一段代码

java 复制代码
books bookdai = new books();
bookdai.setId("1");
bookdai.setType("vue");
bookdai.setName("vue基础到进阶");
bookdai.setDescribe("测试vue内容修改");
books book = BoooksMaaper.save(bookdai);
System.out.println(book);

有些人可能已经蒙了 save不是添加吗?

这里的设定非常有趣呀 save 你的id如果有 它会覆盖 如果没有 就是添加

我们的id 1是已经存在的 所以 它会将我们前面添加那条id为1的数据覆盖掉 就是修改功能了

运行之后 控制台输出一切正常

然后 我们来查一下

会发现 确实是实现了一个修改的效果

然后 我们来看 ES最有特殊的查询

其实ES主要的价值就在于分词的一个查询

首先是查询全部 findAll

我们这样写

java 复制代码
Iterable<books> all = BoooksMaaper.findAll();
for (books book : all){
   System.out.println("book = " +book);
}

调用 findAll 返回一个 泛型为我们实体类的Iterable接口集合

然后 for遍历这个集合 输出每一次结果

运行代码 因为我们总共就一条数据 所以输出的内容就一条 findAll就是查询全部

然后 按照id查询 findById

java 复制代码
Optional<books> byId = BoooksMaaper.findById("1");
System.out.println(byId);

我们查询id为1的内容 并输出

右键运行代码

这里 也是顺利查出来了

然后 他有一个比较特殊函数 感觉不是很实用findAllById

它支持传入list数组

可以传给它多个id 然后带出多条数据

java 复制代码
ArrayList<String> ids = new ArrayList<>();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
Iterable<books> byId = BoooksMaaper.findAllById(ids);

查询 id 1 2 3 4的数据 然后形成一个 实体类泛型的 Iterable集合

然后 我们来说自定义的查询方法

我们 可以在自己写的 BoooksMaaper 接口中写一个这样的函数

java 复制代码
//自定义 根据name查询
List<books> findByName(String name);

这里需要注意 findBy 后面 跟自己要条件查询的字段名 首字母大写 因为如果你不这样 它是找不到你要查哪个字段的

然后 我们测试类来调用这个函数

java 复制代码
List<books> byId = BoooksMaaper.findByName("vue");
System.out.println(byId);

运行代码 这里也顺利通过 vue 模糊查询到了

最后删除方法

我们就看个根据id删除吧 deleteById

没有返回值

我们直接写

java 复制代码
BoooksMaaper.deleteById("1");

右键运行代码

运行状态是OK的 但是 看不出有没有成功

我们请求查询一下索引下的文档

很明显 已经删掉了

相关推荐
程序员-珍16 分钟前
SpringBoot v2.6.13 整合 swagger
java·spring boot·后端
徐*红24 分钟前
springboot使用minio(8.5.11)
java·spring boot·spring
骆晨学长1 小时前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
bjzhang751 小时前
SpringBoot开发——整合SpringDoc实现在线接口文档
spring boot·springdoc
Flying_Fish_roe1 小时前
Spring Boot-Session管理问题
java·spring boot·后端
赚钱给孩子买茅台喝1 小时前
智能BI项目第四期
java·spring boot·spring cloud·aigc
hai405872 小时前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
工业甲酰苯胺4 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
神即道 道法自然 如来5 小时前
Jenkins怎么设置每日自动执行构建任务?
运维·jenkins
bjzhang756 小时前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j