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

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式
  • 前言
  • 添加maven依赖
  • 配置application.properties
  • 测试实体类
    • 方式一:继承 ElasticsearchRepository(适合简单查询)
      • 直接使用
      • 想自定义自己的Repository接口
    • 方式二:使用ElasticsearchRestTemplate(更适合用于复杂查询)
      • 添加单个文档
      • 简单查询-通过id

前言

  • 由 Spring 提供,是 Spring 在 ES 官方接口基础之上的二次封装,使用简单,易于上手;
  • 缺点是更新太慢,SpringBoot 2.2.x 才提供对 es7.x 的支持,版本关联性很大,不易维护;

不过在此还是讲一下 starter 启动器下的 集成步骤,万一官方更新速度加快了呢。

Java High Level Rest Client方式 去集成 Elasticsearch(这个是目前公司常用的方式)

添加maven依赖

<!--spring boot 整合 elasticsearch -->
<!--不用填写具体版本,spring boot 会自动找与之适配的 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置application.properties

旧版本

server.port=8091

spring.elasticsearch.rest.uris=http://127.0.0.1:9200
spring.elasticsearch.rest.username=elastic
spring.elasticsearch.rest.password=1234567

新版本(去掉了rest)

server.port=8091

spring.elasticsearch.uris=http://127.0.0.1:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=1234567

测试实体类

创建一个员工的实体类
关键注解 @Document、@Id、@Field

package com.example.springbootfull.elasticsearch.bean;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 员工实体类
 * @Document:作用在类上,标记实体类为文档对象。 indexName(索引名称,相当于数据库的表名称)
 * @Id:作用在成员变量上,标记一个字段作为id主键。 在Elasticsearch中,文档ID是唯一的,用于标识文档。
 * @Field:定义Java对象属性与Elasticsearch文档字段之间的映射关系。
 * @author
 */
@Document(indexName = "employee_info")
public class EmployeeInfo {

    @Id
    private Long id;

    /**
     * 工号
     */
    @Field(name = "job_no")
    private String jobNo;

    /**
     * 姓名
     */
    @Field(name = "name")
    private String name;

    /**
     * 英文名
     */
    @Field(name = "english_name")
    private String englishName;

    /**
     * 工作岗位
     */
    private String job;

    /**
     * 性别
     */
    private Integer sex;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 薪资
     */
    private BigDecimal salary;

    /**
     * 入职时间
     */
    @Field(name = "job_day", format = DateFormat.date_time)
    private Date jobDay;

    /**
     * 备注
     */
    private String remark;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getJobNo() {
        return jobNo;
    }

    public void setJobNo(String jobNo) {
        this.jobNo = jobNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEnglishName() {
        return englishName;
    }

    public void setEnglishName(String englishName) {
        this.englishName = englishName;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public Date getJobDay() {
        return jobDay;
    }

    public void setJobDay(Date jobDay) {
        this.jobDay = jobDay;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public EmployeeInfo() {
    }

    public EmployeeInfo(Long id, String jobNo, String name, String englishName, String job, Integer sex, Integer age, BigDecimal salary, Date jobDay, String remark) {
        this.id = id;
        this.jobNo = jobNo;
        this.name = name;
        this.englishName = englishName;
        this.job = job;
        this.sex = sex;
        this.age = age;
        this.salary = salary;
        this.jobDay = jobDay;
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "EmployeeInfo{" +
                "id=" + id +
                ", jobNo='" + jobNo + ''' +
                ", name='" + name + ''' +
                ", englishName='" + englishName + ''' +
                ", job='" + job + ''' +
                ", sex=" + sex +
                ", age=" + age +
                ", salary=" + salary +
                ", jobDay=" + jobDay +
                ", remark='" + remark + ''' +
                '}';
    }
}

方式一:继承 ElasticsearchRepository(适合简单查询)

ElasticsearchRepository 提供了一个高级的抽象,使得你可以在不编写任何实现代码的情况下,直接使用预定义的CRUD方法和查询方法。

业务层接口继承 ElasticsearchRepository 类
泛型的参数分别是实体类型和主键类型
例如:

public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long> {

}

然后就可以直接使用了

直接使用

添加单个文档

package com.example.springbootfull.elasticsearch.controller;

import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {

    @Autowired
    private EmployeeInfoRepository elasticRepository;

    @RequestMapping("/save")
    public String save() throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        EmployeeInfo employeeInfo = new EmployeeInfo(6001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");
        elasticRepository.save(employeeInfo);
        return "success";
    }
    
}

执行后,es上面新增成功了。
在这里插入图片描述

想自定义自己的Repository接口

就要遵守 自定义方法命名规范

【自定义方法命名约定】:
在这里插入图片描述

例如:我们来按照年龄区间查询,定义这样的一个方法findByAgeBetween:

/**
 * 需要继承ElasticsearchRepository接口
 * 由于Item实体类中id为Long类型
 */
public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long>
 
    /**
     * 方法名必须遵守SpringData的规范
     * 年龄区间查询
     */
    List<EmployeeInfo> findByAgeBetween(int age1, int age2);
}

然后,再通过saveAll新增多些数据,再进行自定义的方法进行查询

package com.example.springbootfull.elasticsearch.controller;

import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {

    @Autowired
    private EmployeeInfoRepository elasticRepository;

    @RequestMapping("/saveAll")
    public String saveAll() throws Exception {
        List<EmployeeInfo> list = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        list.add(new EmployeeInfo(1001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1002L, "2002", "李四", "lisi", "PHP", 1, 18, new BigDecimal("11600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1003L, "2003", "王五", "wangwu", "C++", 1, 20, new BigDecimal("9900.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1004L, "2004", "赵六", "zhaoliu", "Java Leader", 1, 20, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1005L, "2005", "小五", "xiaowu", "H5", 1, 17, new BigDecimal("10600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1006L, "2006", "小六", "xaioliu", "web", 1, 20, new BigDecimal("12600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1007L, "2007", "小七", "xiaoqi", "app", 1, 22, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1008L, "2008", "小八", "xaioba", "Java", 1, 21, new BigDecimal("11000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1009L, "2009", "小九", "xiaojiu", "Java", 1, 20, new BigDecimal("14000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        list.add(new EmployeeInfo(1010L, "2010", "大十", "dashi", "Java", 1, 20, new BigDecimal("13000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
        elasticRepository.saveAll(list);
        return "success -> " + list.size();
    }

    @RequestMapping("/findByAgeBetween")
    public String findByAgeBetween(){
        elasticRepository.findByAgeBetween(10,20);
        return "success";
    }
    
}

使用 findByAgeBetween 查询后的效果
在这里插入图片描述

方式二:使用ElasticsearchRestTemplate(更适合用于复杂查询)

与 ElasticsearchRepository 相比,ElasticsearchRestTemplate 更适合用于复杂查询 。
比如 多个条件组合、范围查询、模糊查询、聚合查询等复杂场景
还支持分页、排序、过滤等高级功能

添加单个文档
@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
    
    @RequestMapping("/template/save")
    public String  templateSave() throws Exception  {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        EmployeeInfo employeeInfo = new EmployeeInfo(8888L, "2001", "张八", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");
        elasticsearchRestTemplate.save(employeeInfo);
        return "success";
    }

在这里插入图片描述

简单查询-通过id
@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
    
    @RequestMapping("/getEmployeeInfo")
    public EmployeeInfo getEmployeeInfo() {
        return elasticsearchRestTemplate.get("6001", EmployeeInfo.class);
    }

查询结果如下
在这里插入图片描述

批量添加、删除、复杂的查询 等等 其余的我就不多说了

【参考文章】
【1】SpringBoot-starter-data整合Elasticsearch
【2】SpringBoot之ElasticsearchRestTemplate常用示例
【3】Spring Data Elasticsearch篇(3):ElasticsearchRepository文档操作

相关文章:

  • ZYNQ-PL实践课堂(五)IP核之FIFO
  • unity pico开发 五 UI交互
  • PyTorch GPU显存管理与大规模张量操作
  • 虚拟网络IP设置
  • Focal Loss (聚焦损失) :解决类别不平衡与难易样本的利器,让模型学会“重点学习”
  • LINUX网络基础 - 网络编程套接字,UDP与TCP
  • Tauri跨平台开发问题及解决方案深度解析(React版)
  • 学生管理信息系统的需求分析与设计
  • 基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)
  • 新一代信息技术:从技术范畴到未来趋势的全景洞察
  • 千峰React:组件与逻辑封装(下)
  • 神经网络 - 激活函数(Maxout 单元)
  • 【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
  • 苹果iPhone 17 Pro系列将配备12GB内存,AI功能成升级关键
  • 2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!
  • ArcGIS Pro高级应用:高效生成TIN地形模型
  • linux磁盘满了怎么安全删除文件
  • C++编程:常见内置算法
  • 详解Nginx no live upstreams while connecting to upstream
  • c++中的vector
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 河南:响鼓重锤对违规吃喝问题露头就打、反复敲打、人人喊打
  • 农行回应“病重老人被要求亲自取钱在银行去世”:全力配合公安机关调查
  • 青海省交通运输厅副厅长田明有接受审查调查
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略