【Elasticsearch<四>✈️✈️】SpringBoot 项目整合 Elasticsearch

目录

🍸前言

 🍻一、Elasticsearch 本地环境启动

🍺二、SpringBoot 项目整合 Elasticsearch

        2.1 引入 ES 依赖

        2.2 配置 ES 属性

        2.3 创建实体类 

        2.4 操作 ES 的工具类

        2.5 操作 ES 的业务层

🍹三、接口测试

       3.1  编写测试类

        3.2 接口测试

🍷四、章末


🍸前言

        上次了解了 Elasticsearch 中基本属性的使用以及高级查询的操作,操作过程中使用的是 ES 可视化操作工具,接下来看看在 SpringBoot 项目中如何使用 Java API 操作 ES ,原文链接如下:

【Elasticsearch<三>✈️✈️】常见基本属性的用法以及与MySQL的区别-CSDN博客

 🍻一、Elasticsearch 本地环境启动

        依次启动 ES 服务器,kinaba 应用,以及浏览器插件 ElasticSearch-head

        准备好一个 SpringBoot 测试项目

🍺二、SpringBoot 项目整合 Elasticsearch

        2.1 引入 ES 依赖

        Springboot 推荐使用的 ES 对应的版本信息如下(不一定要严格按照版本对应):

        本地使用的是 springboot 版本 2.7 ,所以 ES 版本选择的是 7.17 ,这样做的目的是尽量减少编译时由于版本间支持的内容差异引起的异常情况

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

        2.2 配置 ES 属性

         简单的属性只需配置下 ES 的服务器地址即可

        application.properties 配置文件格式如下:

spring.elasticsearch.uris=http://127.0.0.1:9200// .yml 文件对应的格式如下
spring:elasticsearch:uris: http://127.0.0.1:9200
        2.3 创建实体类 

        注:这里的实体类指定了索引库,需要提前在 kibana 上操作创建对应的索引库,本地使用的是上篇文章中创建好的索引 testmapping

         实体类字段中涉及到的几个注解如下,类中包含的字段和创建的索引库字段对应即可:

@Id

@Id 注解是Elasticsearch中用于标识文档唯一标识符(ID)的注解

@Field 用于定义字段的属性

  • (store = true): 是否将字段的原始值存储在文档中。如果设置为true,表示将该字段的原始值存在文档中(原始值指的是不会经过分词处理)
  • analyzer = "ik_smart": 指定分析器(analyzer),这里使用了"ik_smart"分析器。
  • index = true: 是否对字段进行索引。如果设置为true,则可以在该字段上执行搜索操作;如果设置为false,则不能搜索该字段的内容。
  • searchAnalyzer = "ik_smart": 指定搜索时使用的分析器。通常与analyzer相同,但有时可能会使用不同的分析器来进行搜索。

import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.util.Date;/*** @author ben.huang*/
@Data
//@Document 文档对象注解 (这里指定索引名称)
@Document(indexName = "testmapping")
public class Elasticsearch {@Id//@Field , 每个文档的字段配置(类型,是否分词,是否存储,分词器),只有text 类型的字段支持分词@Field(store = true, index = false, type = FieldType.Text)private String id;@Field(store = true, analyzer = "ik_smart", index = true, searchAnalyzer = "ik_smart", type = FieldType.Text)private String title;@Field(store = true, index = true, type = FieldType.Double)private Double price;@Field(store = true, index = true, type = FieldType.Date)private Date createTime;@Field(store = true, analyzer = "ik_smart", index = true, searchAnalyzer = "ik_smart", type = FieldType.Text)private String description;@Field(index = true, analyzer = "ik_smart", store = true, searchAnalyzer = "ik_smart", type = FieldType.Text)private String content;
}
        2.4 操作 ES 的工具类

        Java 可以通过 org.springframework.data.elasticsearch.repository.ElasticsearchRepository

类操作 ES ,为了方便操作以及定制化方法,可以自己定义一个接口继承,代码如下:

       接口上的两个泛型参数表示操作 Elasticsearch 的实体,并且实体的主键类型是 Integer

        这里自定义了一个高亮查询方法,使用了 @Highlight 注解,表示要对搜索结果进行高亮显示。在 @Highlight 注解中,指定了要高亮显示的字段为 title,并且设置了一些高亮显示的参数,如前置标签、后置标签以及片段数等。

        方法接收字符串参数 title ,用于指定要搜索的标题。返回类型是 List<SearchHit<Elasticsearch>>,其中 SearchHit 对象包含了搜索结果的详细信息,如匹配的文档、匹配度分数等。

import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.annotations.HighlightParameters;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface TestElasticsearchRepository extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository<Elasticsearch,Integer> {@Highlight(fields = {@HighlightField(name = "title")},parameters = @HighlightParameters(preTags = {"<span style='color:red'>"}, postTags = {"</span>"}, numberOfFragments = 0))List<SearchHit<Elasticsearch>> findByTitle(String title);
}
        2.5 操作 ES 的业务层

        2.5.1 业务接口方法定义

        业务方法主要是定义一些常用的操作方法,方便调用,本地创建了几个常用的方法如下:

import org.springframework.data.elasticsearch.core.SearchHit;import java.util.List;/*** @author ben.huang*/
public interface ElasticSearchService {//保存和修改void save(Elasticsearch article);//查询idElasticsearch findById(Integer id);//删除指定ID数据void   deleteById(Integer id);//查询索引库章的总共文档数long count();//是否存在指定的文档IDboolean existsById(Integer id);//高亮查询List<SearchHit<Elasticsearch>> findByTitle(String title);}

        2.5.2 业务方法逻辑实现

        就是业务层接口的方法实现

import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;/*** @author ben.huang*/
@Service
public class ElasticSearchServiceImpl implements ElasticSearchService {@Resourceprivate TestElasticsearchRepository elasticSearchRepository;@Overridepublic void save(Elasticsearch elasticSearch) {elasticSearchRepository.save(elasticSearch);}@Overridepublic Elasticsearch findById(Integer id) {return elasticSearchRepository.findById(id).orElse(new Elasticsearch());}@Overridepublic void deleteById(Integer id) {elasticSearchRepository.deleteById(id);}@Overridepublic long count() {return elasticSearchRepository.count();}@Overridepublic boolean existsById(Integer id) {return elasticSearchRepository.existsById(id);}@Overridepublic List<SearchHit<Elasticsearch>> findByTitle(String title) {return elasticSearchRepository.findByTitle(title);}}

🍹三、接口测试

       3.1  编写测试类

        测试几个主要的方法结果

import com.hb.demo.DemoApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;
import java.util.List;/*** @author ben.huang*/@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class ESTest {@Resourceprivate ElasticSearchService elasticSearchService;/*** 添加文档或者修改文档(以id为准)*/@Testpublic void saveElasticSearch() {Elasticsearch elasticSearch = new Elasticsearch();elasticSearch.setId("5");elasticSearch.setTitle("SpringBoot ElasticSearch Test");elasticSearch.setDescription("SpringBoot 整合 ES 操作数据 SpringBoot ElasticSearch Test");elasticSearchService.save(elasticSearch);}@Testpublic void findById() {Elasticsearch byId = elasticSearchService.findById(1);System.out.println(byId);}@Testpublic void deleteById() {elasticSearchService.deleteById(4);}@Testpublic void count() {long count = elasticSearchService.count();System.out.println(count);}@Testpublic void existsById() {boolean b = elasticSearchService.existsById(5);System.out.println(b);}@Testpublic void findByTitleOrContent() {List<SearchHit<Elasticsearch>> byTitleOrContent = elasticSearchService.findByTitle("服饰类商品");for (SearchHit<Elasticsearch> elasticSearchService : byTitleOrContent) {String id = elasticSearchService.getId();System.out.println(id);List<String> title = elasticSearchService.getHighlightField("title");System.out.println(title);}}}
        3.2 接口测试

        3.2.1 保存文档方法测试

        结果如下,文档正确插入到 ES 中并且可以在 插件上查询到

        3.2.2 根据文档 id 查询方法测试

        这里的测试结果是返回了一个空的 ES 对象,是因为方法的实现中指明了,如果未找到返回一个空的 Optinal 对象,如果 Optional 对象为空,则返回一个新创建的空的 Elasticsearch 对象,避免返回 null

       

         3.2.3 索引库文档数量查询方法测试

        查询出当前索引库(testmapping) 中有七条数据

        3.2.4 是否存在对应的文档方法测试 

        3.2.5 高亮查询方法测试

         结果可以看到查出来的结果由我们自定义的前后标签包裹,页面上显示的时候也就有高亮显示的效果了

🍷四、章末

        文章到这里就结束了~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外贸企业邮箱是什么?做外贸企业邮箱哪个好?

外贸企业邮箱是什么&#xff1f;外贸企业在进行跨国沟通时必不可少的工具就是外贸企业邮箱&#xff0c;外贸企业邮箱需要具备的条件就是海外邮件抵达率高、安全稳定、多语言沟通。而我们又怎么选择一个适合的外贸企业邮箱呢&#xff1f;小编今天带您一起了解。 一、外贸企业邮…

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕汉字显示示例

所需模块micropython-ssd1306模块 中文下载站&#xff1a;https://www.cnpython.com/pypi/micropython-ssd1306/download 官方下载站&#xff1a;https://pypi.org/project/micropython-ssd1306/ 汉字取模说明 取模工具&#xff1a;pctolcd2002取模方式&#xff1a; UTF-8字…

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植

1 SFUD介绍 1.1 初步介绍 SFUD 是一个开源的串行 SPI 闪存通用驱动库。由于市面上有各种类型的串行闪存设备&#xff0c;每种设备都具有不同的规格和指令&#xff0c;因此 SFUD 的设计目的是解决这些差异。这使得我们的产品可以支持不同品牌和规格的闪存&#xff0c;增强了软…

408数据结构-树与森林 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 树的存储结构 树既可以采用顺序存储结构&#xff0c;又可采用链式存储结构。但无论采取哪种方式&#xff0c;都要求能够唯一地反映树中各结点之间的逻辑关系。 1. 双亲表示法 这种存储结构采用一组连续空间来存储每个结点&#xff0…

「C++ 内存管理篇 00」指针

目录 一、变量&#xff0c;变量名和指针 1. 什么是变量&#xff1f; 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

活动回放 | 如何进行全增量一体的异构数据库实时同步

以 AI领域为代表的新技术不断涌现&#xff0c;新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐&#xff0c;越来越多的企业开始着手&#xff0c;对仍以传统关系型数据库为主的应用后端进行现代化升级。 这就涉及到如何在不影响并保持现有业务系统正常运转的前提下&#xf…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

LeetCode 面试题 17.14 —— 最小 k 个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 第一种方法就是利用快速排序&#xff0c;第一次排序后&#xff0c;数组被划分为了左右两个区间 [ 0 , i ] , [ i 1 , a r r . s i z e ( ) − 1 ] [0, i], [i1, arr.size()-1]…

Docker入门指南:Docker容器的部署(一)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 当今软件开发领域中&#xff0c;Docker 成为了一种流行的容器化技术。Docker 可以帮助开发者将应用程序及其依赖项打包到一个独立且可移植的容器中&#xf…

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候&#xff0c;提示下面的错误信息&#xff1a; java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话&#xff0c;请参考文章&#xff1a; JPA 的…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据&#xff08;分性别&#xff09;&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2002-2021年 2、来源&#xff1a;国家统计局、统计年鉴、各省年鉴 3、指标&#xff1a;行政区划代码、地区、年份、人均受教育年…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量&#xff1a;探索Libevent的高性能I/O架构》&#xff0c;在这篇文章中&#xff0c;你将会学习到Libevent的高性能I/O原理以及应用&#xff0c;并且我会给出源码…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日&#xff0c;MSI在今天进入短暂的休赛&#xff0c;在昨天结束的入围赛之后&#xff0c;PSG战队作为外卡赛区唯一的队伍进入到正赛&#xff0c;另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后&#xff0c;也是进行了淘汰赛的胜败分组赛的抽…

Llama3-Tutorial之LMDeploy高效部署Llama3实践

Llama3-Tutorial之LMDeploy高效部署Llama3实践 Llama 3 近期重磅发布&#xff0c;发布了 8B 和 70B 参数量的模型&#xff0c;lmdeploy团队对 Llama 3 部署进行了光速支持&#xff01;&#xff01;&#xff01; 书生浦语和机智流社区同学光速投稿了 LMDeploy 高效量化部署 Llam…

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能&#xff0c;应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中&#xff0c;当用户在前端页面点击文件上传按钮&#xff0c;应用侧在onShowFileSelector()接口中收到文件上传请求&#xff0c;在此接…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…