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

news2024/9/22 5:05:55

目录

🍸前言

 🍻一、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);

    //查询id
    Elasticsearch findById(Integer id);

    //删除指定ID数据
    void   deleteById(Integer id);

    //查询索引库章的总共文档数
    long count();

    //是否存在指定的文档ID
    boolean 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 {

    @Resource
    private TestElasticsearchRepository elasticSearchRepository;


    @Override
    public void save(Elasticsearch elasticSearch) {
        elasticSearchRepository.save(elasticSearch);
    }

    @Override
    public Elasticsearch findById(Integer id) {
        return elasticSearchRepository.findById(id).orElse(new Elasticsearch());
    }

    @Override
    public void deleteById(Integer id) {
        elasticSearchRepository.deleteById(id);
    }

    @Override
    public long count() {
        return elasticSearchRepository.count();
    }

    @Override
    public boolean existsById(Integer id) {
        return elasticSearchRepository.existsById(id);
    }

    @Override
    public 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 {

    @Resource
    private ElasticSearchService elasticSearchService;


    /**
     * 添加文档或者修改文档(以id为准)
     */
    @Test
    public void saveElasticSearch() {
        Elasticsearch elasticSearch = new Elasticsearch();
        elasticSearch.setId("5");
        elasticSearch.setTitle("SpringBoot ElasticSearch Test");
        elasticSearch.setDescription("SpringBoot 整合 ES 操作数据 SpringBoot ElasticSearch Test");
        elasticSearchService.save(elasticSearch);
    }

    @Test
    public void findById() {
        Elasticsearch byId = elasticSearchService.findById(1);
        System.out.println(byId);
    }

    @Test
    public void deleteById() {
        elasticSearchService.deleteById(4);

    }

    @Test
    public void count() {
        long count = elasticSearchService.count();
        System.out.println(count);
    }

    @Test
    public void existsById() {
        boolean b = elasticSearchService.existsById(5);

        System.out.println(b);
    }

    @Test
    public 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.coloradmin.cn/o/1645480.html

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

相关文章

【信息安全】密码学

信息验证遇到的问题Message Authentication In the context of communications across a network, the following attacks can be identified. 泄密Disclosure 流量分析Traffic analysis 伪装Masquerade Content modification Sequence modification Time modification …

一、写给Android开发者之harmony入门

一、创建新项目 对比 android-studio&#xff1a;ability类似安卓activity ability分为两种类型(Stage模型) UIAbility和Extensionability&#xff08;提供系统服务和后台任务&#xff09; 启动模式 1、 singleton启动模式&#xff1a;单例 2、 multiton启动模式&#xff1…

学习Rust的第29天: cat in Rust

今天即将是这个系列的最后一次内容&#xff0c;我们正在catRust 中从 GNU 核心实用程序进行重建。cat用于将文件内容打印到STDOUT.听起来很容易构建&#xff0c;所以让我们开始吧。 GitHub 存储库&#xff1a;GitHub - shafinmurani/gnu-core-utils-rust 伪代码 function read(…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH&#xff08;安全性&#xff09;1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙&#xff08;UFW&#xff09;锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

js api part4

其他事件 页面加载事件 外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 原因&#xff1a;有些时候需要等页面资源全部处理完了做一些事情&#xff0c;老代码喜欢把 script 写在 head 中&#xff0c;这时候直接找 dom 元素找不到。 事件…

实测好评!微信自动回复消息神器!高效沟通拿捏住!

随着企业规模的扩大和客户数量的增加&#xff0c;有效管理和回复每一条消息变得越来越具有挑战性。今天&#xff0c;就给大家分享一个高效的自动回复消息神器——个微管理系统&#xff0c;让你能够轻松应对各种沟通需求。 1、自动通过好友&#xff0c;提高沟通效率 每当有新的…

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件&#xff0c;文件名很多都是一大串字母和数字&#xff0c;不打开看看&#xff0c;根本不知道里面是什么内容。 我想能不能做个工具&#xff0c;把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码

PHP基于B/S版 医院不良事件管理系统源码vscodelaravel8医院如何加强不良事件上报系统的管理 AEMS系统源码 医院安全&#xff08;不良&#xff09;事件管理AEMS系统AEMS采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要…

数据分析从入门到精通 2.pandas修真之前戏基础

从爱上自己那天起&#xff0c;人生才真正开始 —— 24.5.6 为什么学习pandas numpy已经可以帮助我们进行数据的处理了&#xff0c;那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据&#xff0c;当然在数据分析中除了数值型的数据还有好多其他类型…

笔试强训-day17_T2 十字爆破

一、题目链接 十字爆破 二、题目描述 牛牛在玩一个游戏&#xff1a; 一共有n行m列共nm个方格&#xff0c;每个方格中有一个整数。 牛牛选择一个方格&#xff0c;可以得到和这个方格同行、同列的所有数之和的得分。 例如&#xff1a;对于一个22的方格&#xff1a; 1 2 3 4 牛牛…

用js代码实现贪吃蛇小游戏

js已经学了大部分了&#xff0c;现在就利用我所学的js知识试试做贪吃蛇小游戏吧 以下部分相关图片以及思路笔记均出自渡一陈老师的视频 首先制作简单的静态页面&#xff0c;添加贪吃蛇移动的背景和相关图片&#xff0c;比如开始游戏等等 将各个功能均封装在函数中&#xff0…

大数据技术主要学什么,有哪些课程

大数据技术是指在海量数据的环境下&#xff0c;采集、存储、处理、分析和管理数据的一系列技术与方法。随着互联网、物联网以及各种智能设备的普及&#xff0c;数据量呈爆炸性增长&#xff0c;传统数据处理手段已难以应对&#xff0c;因此大数据技术应运而生&#xff0c;旨在从…

包管理工具npm、cnpm、yarn、NVM

[包]英文单词是package,代表了一组特定功能的源码集合 包管理工具&#xff1a; 管理[包]的应用软件,可以对[包]进行下载安装,更新,删除,上传等操作借助包管理工具,可以快速开发项目,提升开发效率 包管理工具是一个通用的概念,很多编程语言都有包管理工具,所以掌握好包管理工具非…

供应链|经典论文解读:(s,S) 策略在动态库存下的最优性

文章考虑了具有订购成本&#xff08;由单位成本加上重新订购成本组成&#xff09;的动态库存问题。具体而言&#xff0c;对于每个时期&#xff0c;系统在中期开始是做出一系列采购决策——这些采购有助于库存的积累&#xff0c;并在随后的周期被需求所消耗。每时期系统会产生各…

开源15T tokens!HuggingFace放出规模最大、质量最高预训练数据集 | 最新快讯

新智元报道 编辑&#xff1a;LRS FineWeb 是一个高质量的预训练数据集&#xff0c;包含 15T 个 tokens&#xff0c;主要包含英语文本&#xff1b;消融实验证明了 FineWeb 数据集的质量要高于其他开源数据集&#xff1b;数据清洗脚本也已开源。 Meta 最近开源的 Llama 3 模型再次…

如何根据IP获取国家省份城市名称PHP免费版

最近项目遇到需要根据IP获取用户国家功能需求&#xff0c;网上找了一下&#xff0c;很多API接口都需要付费&#xff0c;考虑为公司节约成本&#xff0c;就取找找有没有开源的 github 上面那个包含多种语言&#xff0c;下面这个只有php&#xff0c;用法很简单 $ip 114.114.114…

QT7_视频知识点笔记_1_ 基础知识(帮助文档),窗口(内存回收机制),信号槽(传参),Lambda表达式

1.QT基础 QT是一个框架&#xff0c;不用像C语言自己从底层写&#xff0c;需要的功能可以先看是否QT库中有直接可使用的 帮助文档的使用&#xff1a;F1跳入帮助文档&#xff0c; QT中常用的类&#xff1a;比如QPushbutton&#xff0c;查看帮助文档则可知道对应的函数和解决方…

C语言知识点补充——操作符详解

1、计算幂次数和平方根 使用<math.h>数学库 pow()函数计算幂次数&#xff1b;sqrt()函数计算平方根。 注&#xff1a;sqrt()输入同样的数字&#xff0c;计算出来的数值&#xff0c;可能不相等&#xff0c;因为输出double数&#xff0c;小数点后面的数值不一定一致。 2…

制作外贸脚本的流程和代码分享!

在全球化的今天&#xff0c;外贸业务成为了许多企业拓展市场、增加收入的重要途径&#xff0c;而在外贸业务中&#xff0c;一个优秀的脚本往往能够起到事半功倍的效果。 那么&#xff0c;如何制作一个高效、专业的外贸脚本呢?本文将为您详细解析制作外贸脚本的流程&#xff0…