当前位置: 首页 > news >正文

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

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引
在这里插入图片描述
首先 pom.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格式的

spring:elasticsearch:hosts: http://localhost:9200

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

然后 我们在启动类同目录下 创建一个叫 domain的包 放属性类
然后在这个包下创建一个叫 books的类
参考代码如下

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;}@Overridepublic String toString() {return "books{" +"id='" + id + '\'' +", type='" + type + '\'' +", name='" + name + '\'' +", description='" + describe + '\'' +'}';}
}

在这里插入图片描述
这里 我们就定义了几个属性 声明get set函数 然后 为了不免错误 我们id直接给了个字符串类型
重写了toString 让大家能够更直观的看到属性
然后 Document 的indexName 告诉程序 我们要用的是哪一个索引 这里我们给了个 books 表示操作books 索引

然后 我们创建一个Mapper接口 这里 我们直接就叫 BooksMapper
在这里插入图片描述
接口代码如下

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 名字无所谓
然后 编写代码如下

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 {@Autowiredprivate Environment environment;@Beanpublic RestHighLevelClient elasticsearchClient() {String elasticsearchHosts = environment.getProperty("spring.elasticsearch.hosts");RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchHosts));// 设置其他配置,如认证信息、连接超时等RestHighLevelClient client = new RestHighLevelClient(builder);return client;}
}

在这里插入图片描述
然后 我们在测试类 中将这个接口条件装配进来
在这里插入图片描述
测试类代码编写如下

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 {@Autowiredprivate BoooksMaaper BoooksMaaper;@Testvoid 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
就会看到 这里确实是进来了
在这里插入图片描述
然后呢 这个东西的修改比较有意思
我们还是这样一段代码

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
我们这样写

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

调用 findAll 返回一个 泛型为我们实体类的Iterable接口集合
然后 for遍历这个集合 输出每一次结果

运行代码 因为我们总共就一条数据 所以输出的内容就一条 findAll就是查询全部
在这里插入图片描述
然后 按照id查询 findById

Optional<books> byId = BoooksMaaper.findById("1");
System.out.println(byId);

我们查询id为1的内容 并输出
右键运行代码
在这里插入图片描述
这里 也是顺利查出来了
在这里插入图片描述
然后 他有一个比较特殊函数 感觉不是很实用findAllById
它支持传入list数组
可以传给它多个id 然后带出多条数据

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 接口中写一个这样的函数

//自定义 根据name查询
List<books> findByName(String name);

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

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

List<books> byId = BoooksMaaper.findByName("vue");
System.out.println(byId);

在这里插入图片描述
运行代码 这里也顺利通过 vue 模糊查询到了
在这里插入图片描述
最后删除方法
我们就看个根据id删除吧 deleteById
没有返回值
我们直接写

BoooksMaaper.deleteById("1");

右键运行代码
在这里插入图片描述
运行状态是OK的 但是 看不出有没有成功
我们请求查询一下索引下的文档
在这里插入图片描述
很明显 已经删掉了

相关文章:

  • linux 生成 ca 证书
  • 体悟PyTorch的优雅
  • 毫无基础的人如何入门 Python ?
  • 十分钟GIS——geoserver+postgis+udig从零开始发布地图服务
  • hadoop使用公平调度器
  • 包装组件的优点和可能的挑战
  • 鸿蒙开发系列教程(十六)--日志处理
  • B2052 简单计算器(洛谷)
  • Vue3快速上手(二)VSCode官方推荐插件安装及配置
  • IDEA 推荐插件
  • 苹果macbook电脑删除数据恢复该怎么做?Mac电脑误删文件的恢复方法
  • 天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围
  • android下library打包aar并上传到maven,嵌入版的app
  • 爬虫笔记(三):实战qq登录
  • 视频上传 - 断点续传那点事
  • “大数据应用场景”之隔壁老王(连载四)
  • Create React App 使用
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java多线程(4):使用线程池执行定时任务
  • js学习笔记
  • socket.io+express实现聊天室的思考(三)
  • spring boot 整合mybatis 无法输出sql的问题
  • ubuntu 下nginx安装 并支持https协议
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 什么是Javascript函数节流?
  • 无服务器化是企业 IT 架构的未来吗?
  • 运行时添加log4j2的appender
  • 最简单的无缝轮播
  • (1)Nginx简介和安装教程
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (LeetCode) T14. Longest Common Prefix
  • (zt)最盛行的警世狂言(爆笑)
  • (独孤九剑)--文件系统
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (数据结构)顺序表的定义
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)3D模板阴影原理
  • (转)C#调用WebService 基础
  • (转)ORM
  • (转)关于pipe()的详细解析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *2 echo、printf、mkdir命令的应用
  • .chm格式文件如何阅读
  • .NET Core中Emit的使用
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件