springboot 整合 ElasticSearch 方法 (一)

news/2024/7/7 5:52:27 标签: spring boot, elasticsearch, 后端

下载 ES

相当于安装 MySQL, 可以在官网上下载 (链接在后面). 要注意安装的 ES 的版本要和项目中用的 Springboot 的版本对应.

比如我用的 Springboot 版本是 2.6, 所以ES要下载7.15 版本的.

在这里插入图片描述

官网链接: https://www.elastic.co/cn/downloads/elasticsearch

点右边这个查看更多版本, 然后找到对应的版本下载就可以了.

这里我点了以后网页怎么都打不开, 找不到对应的版本下载, 然后我就直接把url改成这样下载到的 (把版本换成了7.15.2, 后缀换成了zip): https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-windows-x86_64.zip

在这里插入图片描述

安装

下载到安装包以后, 解压这个安装包, 然后点击这个 bat 文件运行就可以了.

在这里插入图片描述

在这里插入图片描述

(看别的文章说, 项目运行的时候这个命令框要开着.)

看到 successfully 以后去 localhost:9200 (这个端口默认是9200) 看一下有没有成功. 像下面这个图一样的结果就是成功了.

localhost:9200

在这里插入图片描述

依赖

pom.xml中引入es依赖:

        <!-- es -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

说明:
spring-boot-starter-data-elasticsearch 这个依赖是 springboot 重新整合了 ES 的一个依赖, 并不是 ES 本身的依赖.

有些文章中会提到, 安装依赖的时候安装的是 elasticsearch, elasticsearch-rest-high-level-client 之类的 , 这才是 es 本身的依赖 ( 另一篇文章: pringboot 整合 ElasticSearch 方法(二) 中用的就是这种方法).

配置

ES 的配置有两种方式: 一种是把配置信息写在 application.yml 文件中; 另一种是写一个配置类. 两种方法都可以, 写配置类的方法更加灵活.

配置类

新建一个 config 文件夹, 然后把测试类写在这里:

在这里插入图片描述

package com.example.demo.config;

import lombok.Data;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;

@Data
@Configuration
public class ElasticConfig extends AbstractElasticsearchConfiguration {

    @Bean
    @Override
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
//                .withSocketTimeout(600000)
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
}

使用

实体类

package com.example.demo.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import java.util.Date;

@Data
@Document(indexName = "log") // 索引的名称
public class Log {

    @Id
    private String id;
    private String content;
    private Date time;

}

说明

实体类中的 id 是必须有的, 不管是String 还是Integer形式的都不影响, 但是要有这个字段. 不然创建mapper这个bean的时候会报错的.

实体类有id这个字段, 存数据的时候, id不是必传的, 不传也不会报错, 不传ES会自动生成id, 下面就是把 id 设置为 String 类型, 存储的时候不传id得到的数据:

在这里插入图片描述

Mapper / Repository

好多文章里写的是新建一个 Repository 文件夹.

mapper 中 extends 了一个方法, 这样就在 LogMapper 中提供了一些基本的增删改查方法, 就不需要再在 mapper 里再自己手动写这些方法了.

extends ElasticsearchRepository 后面第一个参数是实体类的名称(这里是Log), 第二个参数是实体类id的类型(这里Log实体类中id为Integer)

提供的这些方法在测试类里面 @Autowired 注入 logMapper 以后, 输入 logMapper. 也会有提示的.

但是这个依赖提供的 extends ElasticsearchRepository 好像有些 springboot 的版本是不支持的, 就会报各种错以及各种标红 (我试了出错的版本是 springboot 2.10, 处理方法在另一篇文章: pringboot 整合 ElasticSearch 方法(二) 中).

在这里插入图片描述

package com.example.demo.mapper;

import com.example.demo.pojo.Log;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface LogMapper extends ElasticsearchRepository<Log,Integer> {
}

( 这个里面可以不写方法的, 默认会使用一些自带的方法, 没有漏粘代码. )

测试类

这个测试类可以直接写在这个默认的里面就好了. 反正只是测试一下, 真实项目也要改的.

如果新建了测试类, 不要忘记加 @RunWith(SpringRunner.class) 注解(因为配置类是写在config文件夹下面的, 需要 @Autowired 注入一起启动)

注入一下 logMapper, 然后就可以开始写不同的测试类了.

在这里插入图片描述

一些简单的方法:

package com.example.demo;

import com.example.demo.mapper.LogMapper;
import com.example.demo.pojo.Log;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.Optional;

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private LogMapper logMapper;

    @Test
    void add() {
        for(int i=1;i<11;i++) {
            Log log = new Log();
            Date currentDate = new Date();

            log.setId(i);
            log.setContent("this is content"+i);
            log.setTime(currentDate);

            logMapper.save(log);
        }
    }

    @Test
    void delete(){
        Integer id = 1;
        logMapper.deleteById(id);
    }

    @Test
    void update() {
        Log updateLog = new Log();
        Date currentDate = new Date();

        updateLog.setId(2);
        updateLog.setContent("update message");
        updateLog.setTime(currentDate);

        logMapper.save(updateLog);
    }

    @Test
    void find() {
        Iterable<Log> all = logMapper.findAll(); // 查找全部的文档数据, 返回结果是没有顺序的
        ArrayList<Log> list = new ArrayList<>(); // 利用list给返回的结果排序

        for(Log log:all){
            list.add(log);
            System.out.println(log);
        }
        // 使用list的方法实现排序
    }

    @Test
    void findById() {
        Optional<Log> byId = logMapper.findById(4);
        System.out.println(byId);
    }

    @Test
    void findByIdAll() {
        ArrayList<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        Iterable<Log> allById = logMapper.findAllById(ids);

        // 打印结果
        for(Log log:allById){
            System.out.println(log); // 如果给的id在索引里没有, 就不会输出(这里不会报错的)
        }
    }

}

如果不传id, 不会报错, es会自动生成id的, 如下:

在这里插入图片描述


http://www.niftyadmin.cn/n/5342605.html

相关文章

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们在使用opencv的时候&#xff0c;虽然大部分算法都不需要我们自己重头开始编写&#xff0c;但是总有一些关于我们自己产品的know-how&#xff0…

初识node.js(使用)

文章目录 项目目录介绍和运行流程1.index.html&#x1f447;2.整个项目的核心入口文件其实是main.js3.App.vue 组件化开发 和 根组件普通组件的注册1.局部注册2.全局注册 综合案例 项目目录介绍和运行流程 1.index.html&#x1f447; <!DOCTYPE html> <html lang&quo…

时间序列大模型:TimeGPT

论文&#xff1a;https://arxiv.org/pdf/2310.03589.pdf TimeGPT&#xff0c;这是第一个用于时间序列的基础模型&#xff0c;能够为训练期间未见过的多样化数据集生成准确的预测。 大规模时间序列模型通过利用当代深度学习进步的能力&#xff0c;使精确预测和减少不确定性成为…

Python - argparse模块

python中的argparse模块&#xff0c;用于命令后参数解析&#xff0c;方便测试&#xff0c;是python中自带的模块。 可以自动生成帮助文档&#xff0c;和使用手册。而且当用户在执行程序的时候&#xff0c;输入无效的参数时&#xff0c;会给出对应的错误信息。 使用方法&#…

Flink编程——基础环境搭建

基础环境搭建 文章目录 基础环境搭建准备环境搭建源码环境搭建克隆代码编译导入IDEA 集群环境搭建本地模式安装步骤 1&#xff1a;下载步骤 2&#xff1a;启动集群步骤 3&#xff1a;提交作业&#xff08;Job&#xff09;步骤 4&#xff1a;停止集群 总结 准备环境搭建 我们先…

C# .Net6搭建灵活的RestApi服务器

1、准备 C# .Net6后支持顶级语句&#xff0c;更简单的RestApi服务支持&#xff0c;可以快速搭建一个极为简洁的Web系统。推荐使用Visual Studio 2022&#xff0c;安装"ASP.NET 和Web开发"组件。 2、创建工程 关键步骤如下&#xff1a; 包添加了“Newtonsoft.Json”&…

Matlab 将工作区变量保存到文件中(save)

语法 1、save(filename) 2、save(filename,variables) 3、save(filename,variables,fmt) 4、save(filename,variables,version) 5、save(filename,variables,version,-nocompression) 6、save(filename,variables,-append) 7、save(filename,variables,-append,-nocompression…

《微信小程序开发从入门到实战》学习九十一

7.1 视图容器组件 7.1.2 scroll-view组件 scroll-view组件时是滚动的视图容器&#xff0c;可在竖直方向或水平方向上滚动&#xff0c;展示超出屏幕高度或宽度的内容。 使用竖直方向滚动时&#xff0c;需要通过wxss的height样式给scroll-view设置一个固定高度&#xff0c;超出…