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的 但是 看不出有没有成功

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

很明显 已经删掉了

相关推荐
Lovely_red_scarf1 分钟前
Jenkins系列
jenkins
程序员勋勋1 小时前
【自动化测试】如何在jenkins中搭建allure
职场和发展·jenkins·测试覆盖率
狂放不羁霸2 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
计算机学长felix3 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。3 小时前
Spring Boot 配置文件
java·spring boot·后端
江深竹静,一苇以航3 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
豪宇刘4 小时前
SpringBoot+Shiro权限管理
java·spring boot·spring
customer084 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589365 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端