SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsear ...

打印 上一主题 下一主题

主题 805|帖子 805|积分 2415

媒介



  • 由 Spring 提供,是 Spring 在 ES 官方接口基础之上的二次封装,使用简朴,易于上手;
  • 缺点是更新太慢,SpringBoot 2.2.x 才提供对 es7.x 的支持,版本关联性很大,不易维护;
不外在此照旧讲一下 starter 启动器下的 集成步骤,万一官方更新速率加快了呢。
Java High Level Rest Client方式 去集成 Elasticsearch(这个是目前公司常用的方式)
添加maven依靠

  1. <!--spring boot 整合 elasticsearch -->
  2. <!--不用填写具体版本,spring boot 会自动找与之适配的 -->
  3. <dependency>
  4.   <groupId>org.springframework.boot</groupId>
  5.   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  6. </dependency>
复制代码
配置application.properties

旧版本
  1. server.port=8091
  2. spring.elasticsearch.rest.uris=http://127.0.0.1:9200
  3. spring.elasticsearch.rest.username=elastic
  4. spring.elasticsearch.rest.password=1234567
复制代码
新版本(去掉了rest)
  1. server.port=8091
  2. spring.elasticsearch.uris=http://127.0.0.1:9200
  3. spring.elasticsearch.username=elastic
  4. spring.elasticsearch.password=1234567
复制代码
测试实体类

创建一个员工的实体类
关键注解 @Document、@Id、@Field
  1. package com.example.springbootfull.elasticsearch.bean;
  2. import org.springframework.data.annotation.Id;
  3. import org.springframework.data.elasticsearch.annotations.DateFormat;
  4. import org.springframework.data.elasticsearch.annotations.Document;
  5. import org.springframework.data.elasticsearch.annotations.Field;
  6. import java.math.BigDecimal;
  7. import java.util.Date;
  8. /**
  9. * 员工实体类
  10. * @Document:作用在类上,标记实体类为文档对象。 indexName(索引名称,相当于数据库的表名称)
  11. * @Id:作用在成员变量上,标记一个字段作为id主键。 在Elasticsearch中,文档ID是唯一的,用于标识文档。
  12. * @Field:定义Java对象属性与Elasticsearch文档字段之间的映射关系。
  13. * @author
  14. */
  15. @Document(indexName = "employee_info")
  16. public class EmployeeInfo {
  17.     @Id
  18.     private Long id;
  19.     /**
  20.      * 工号
  21.      */
  22.     @Field(name = "job_no")
  23.     private String jobNo;
  24.     /**
  25.      * 姓名
  26.      */
  27.     @Field(name = "name")
  28.     private String name;
  29.     /**
  30.      * 英文名
  31.      */
  32.     @Field(name = "english_name")
  33.     private String englishName;
  34.     /**
  35.      * 工作岗位
  36.      */
  37.     private String job;
  38.     /**
  39.      * 性别
  40.      */
  41.     private Integer sex;
  42.     /**
  43.      * 年龄
  44.      */
  45.     private Integer age;
  46.     /**
  47.      * 薪资
  48.      */
  49.     private BigDecimal salary;
  50.     /**
  51.      * 入职时间
  52.      */
  53.     @Field(name = "job_day", format = DateFormat.date_time)
  54.     private Date jobDay;
  55.     /**
  56.      * 备注
  57.      */
  58.     private String remark;
  59.     public Long getId() {
  60.         return id;
  61.     }
  62.     public void setId(Long id) {
  63.         this.id = id;
  64.     }
  65.     public String getJobNo() {
  66.         return jobNo;
  67.     }
  68.     public void setJobNo(String jobNo) {
  69.         this.jobNo = jobNo;
  70.     }
  71.     public String getName() {
  72.         return name;
  73.     }
  74.     public void setName(String name) {
  75.         this.name = name;
  76.     }
  77.     public String getEnglishName() {
  78.         return englishName;
  79.     }
  80.     public void setEnglishName(String englishName) {
  81.         this.englishName = englishName;
  82.     }
  83.     public String getJob() {
  84.         return job;
  85.     }
  86.     public void setJob(String job) {
  87.         this.job = job;
  88.     }
  89.     public Integer getSex() {
  90.         return sex;
  91.     }
  92.     public void setSex(Integer sex) {
  93.         this.sex = sex;
  94.     }
  95.     public Integer getAge() {
  96.         return age;
  97.     }
  98.     public void setAge(Integer age) {
  99.         this.age = age;
  100.     }
  101.     public BigDecimal getSalary() {
  102.         return salary;
  103.     }
  104.     public void setSalary(BigDecimal salary) {
  105.         this.salary = salary;
  106.     }
  107.     public Date getJobDay() {
  108.         return jobDay;
  109.     }
  110.     public void setJobDay(Date jobDay) {
  111.         this.jobDay = jobDay;
  112.     }
  113.     public String getRemark() {
  114.         return remark;
  115.     }
  116.     public void setRemark(String remark) {
  117.         this.remark = remark;
  118.     }
  119.     public EmployeeInfo() {
  120.     }
  121.     public EmployeeInfo(Long id, String jobNo, String name, String englishName, String job, Integer sex, Integer age, BigDecimal salary, Date jobDay, String remark) {
  122.         this.id = id;
  123.         this.jobNo = jobNo;
  124.         this.name = name;
  125.         this.englishName = englishName;
  126.         this.job = job;
  127.         this.sex = sex;
  128.         this.age = age;
  129.         this.salary = salary;
  130.         this.jobDay = jobDay;
  131.         this.remark = remark;
  132.     }
  133.     @Override
  134.     public String toString() {
  135.         return "EmployeeInfo{" +
  136.                 "id=" + id +
  137.                 ", jobNo='" + jobNo + '\'' +
  138.                 ", name='" + name + '\'' +
  139.                 ", englishName='" + englishName + '\'' +
  140.                 ", job='" + job + '\'' +
  141.                 ", sex=" + sex +
  142.                 ", age=" + age +
  143.                 ", salary=" + salary +
  144.                 ", jobDay=" + jobDay +
  145.                 ", remark='" + remark + '\'' +
  146.                 '}';
  147.     }
  148. }
复制代码
方式一:继续 ElasticsearchRepository(适合简朴查询)

   ElasticsearchRepository 提供了一个高级的抽象,使得你可以在不编写任何实当代码的情况下,直接使用预界说的CRUD方法和查询方法。
  业务层接口继续 ElasticsearchRepository 类
泛型的参数分别是实体类型和主键类型
例如:
  1. public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long> {
  2. }
复制代码
然后就可以直接使用了
直接使用

添加单个文档
  1. package com.example.springbootfull.elasticsearch.controller;
  2. import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
  3. import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
  4. import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.math.BigDecimal;
  10. import java.text.SimpleDateFormat;
  11. import java.util.ArrayList;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. @RestController
  15. @RequestMapping("/employeeInfo")
  16. public class EmployeeElasticController {
  17.     @Autowired
  18.     private EmployeeInfoRepository elasticRepository;
  19.     @RequestMapping("/save")
  20.     public String save() throws Exception {
  21.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  22.         EmployeeInfo employeeInfo = new EmployeeInfo(6001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");
  23.         elasticRepository.save(employeeInfo);
  24.         return "success";
  25.     }
  26.    
  27. }
复制代码
执行后,es上面新增成功了。

想自界说自己的Repository接口

   就要遵守 自界说方法命名规范
  【自界说方法命名约定】:

例如:我们来按照年龄区间查询,界说如许的一个方法findByAgeBetween:
  1. /**
  2. * 需要继承ElasticsearchRepository接口
  3. * 由于Item实体类中id为Long类型
  4. */
  5. public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long>
  6.     /**
  7.      * 方法名必须遵守SpringData的规范
  8.      * 年龄区间查询
  9.      */
  10.     List<EmployeeInfo> findByAgeBetween(int age1, int age2);
  11. }
复制代码
然后,再通过saveAll新增多些数据,再进行自界说的方法进行查询
  1. package com.example.springbootfull.elasticsearch.controller;
  2. import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
  3. import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
  4. import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.math.BigDecimal;
  10. import java.text.SimpleDateFormat;
  11. import java.util.ArrayList;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. @RestController
  15. @RequestMapping("/employeeInfo")
  16. public class EmployeeElasticController {
  17.     @Autowired
  18.     private EmployeeInfoRepository elasticRepository;
  19.     @RequestMapping("/saveAll")
  20.     public String saveAll() throws Exception {
  21.         List<EmployeeInfo> list = new ArrayList<>();
  22.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  23.         list.add(new EmployeeInfo(1001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  24.         list.add(new EmployeeInfo(1002L, "2002", "李四", "lisi", "PHP", 1, 18, new BigDecimal("11600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  25.         list.add(new EmployeeInfo(1003L, "2003", "王五", "wangwu", "C++", 1, 20, new BigDecimal("9900.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  26.         list.add(new EmployeeInfo(1004L, "2004", "赵六", "zhaoliu", "Java Leader", 1, 20, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  27.         list.add(new EmployeeInfo(1005L, "2005", "小五", "xiaowu", "H5", 1, 17, new BigDecimal("10600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  28.         list.add(new EmployeeInfo(1006L, "2006", "小六", "xaioliu", "web", 1, 20, new BigDecimal("12600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  29.         list.add(new EmployeeInfo(1007L, "2007", "小七", "xiaoqi", "app", 1, 22, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  30.         list.add(new EmployeeInfo(1008L, "2008", "小八", "xaioba", "Java", 1, 21, new BigDecimal("11000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  31.         list.add(new EmployeeInfo(1009L, "2009", "小九", "xiaojiu", "Java", 1, 20, new BigDecimal("14000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  32.         list.add(new EmployeeInfo(1010L, "2010", "大十", "dashi", "Java", 1, 20, new BigDecimal("13000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));
  33.         elasticRepository.saveAll(list);
  34.         return "success -> " + list.size();
  35.     }
  36.     @RequestMapping("/findByAgeBetween")
  37.     public String findByAgeBetween(){
  38.         elasticRepository.findByAgeBetween(10,20);
  39.         return "success";
  40.     }
  41.    
  42. }
复制代码
使用 findByAgeBetween 查询后的结果

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

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

  1. @RestController
  2. @RequestMapping("/employeeInfo")
  3. public class EmployeeElasticController {
  4.     @Autowired
  5.     private ElasticsearchRestTemplate elasticsearchRestTemplate;
  6.    
  7.     @RequestMapping("/template/save")
  8.     public String  templateSave() throws Exception  {
  9.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  10.         EmployeeInfo employeeInfo = new EmployeeInfo(8888L, "2001", "张八", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");
  11.         elasticsearchRestTemplate.save(employeeInfo);
  12.         return "success";
  13.     }
复制代码

简朴查询-通过id

  1. @RestController
  2. @RequestMapping("/employeeInfo")
  3. public class EmployeeElasticController {
  4.     @Autowired
  5.     private ElasticsearchRestTemplate elasticsearchRestTemplate;
  6.    
  7.     @RequestMapping("/getEmployeeInfo")
  8.     public EmployeeInfo getEmployeeInfo() {
  9.         return elasticsearchRestTemplate.get("6001", EmployeeInfo.class);
  10.     }
复制代码
查询结果如下

批量添加、删除、复杂的查询 等等 其余的我就不多说了
【参考文章】
【1】SpringBoot-starter-data整合Elasticsearch
【2】SpringBoot之ElasticsearchRestTemplate常用示例
【3】Spring Data Elasticsearch篇(3):ElasticsearchRepository文档操作

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表