SpringBoot 2.6 集成es 7.17

引言

在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在Spring Boot 2.6版本中集成Elasticsearch 7.17版本,并提供一些基本的操作指南。

基础环境

JDK 17 (SpringBoot 2.6.13 要求JDK版本为JDK17)

Elasticsearch (7.17.16)

版本探讨

springboot提供了spring-boot-starter-data-elasticsearch 可以供我们方便的集成es ,但是需要重点强调的是 几个组件间的版本兼容性 。这个可以直接参考官方文档中的版本说明

其他的版本 spring-data-elasticsearch 文档总目录参见 :

https://docs.spring.io/spring-data/elasticsearch/docs/

看这个文档说明 springboot 2,6.12 可使用 spring data starter 2.6.12版本 内置的 spring-data-elasticsearch 是4.3.9 看文档描述是支持的,但是实际测试过程中,会有各种各样的报错

这里直接推荐一个 可使用的spring data starter es 版本

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.18</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

名称解释

  1. 文档(Document)

    在Elasticsearch中,文档是存储数据的最小单位。它相当于关系型数据库中的一行记录。文档以JSON格式存储,可以包含多个字段,这些字段可以是简单的数据类型(如字符串、整数、布尔值)或复杂的数据类型(如嵌套对象、数组等)。

  2. 索引(Index)

    索引是一组文档的集合,类似于关系型数据库中的一个表。索引用于存储、搜索和检索文档。在Elasticsearch中,索引是有类型的,但类型的概念在Elasticsearch 6.x中已被弃用。索引可以配置不同的设置,如分片数、副本数、映射和分析器等。

  3. 映射(Mapping)

    映射定义了文档的结构,包括字段的名称、字段的数据类型和一些其他设置,如是否存储、是否索引等。映射可以在创建索引时定义,也可以在索引创建后动态添加字段。

集成

添加依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.18</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

添加配置

yaml 复制代码
spring:
  application:
    name: xxxx
  elasticsearch:
    connection-timeout: 3s
    socketTimeout: 3s
    uris: http://xxx:30859
    # 可选则配置账号密码
    #username: sxx
    #password: xxx

添加文档 实体类

定义文档实体类,这些类对应于Elasticsearch索引中的文档。

以下是一些常用的注解和它们的用途。

  1. @Document 注解
    @Document注解用于标识一个类作为Elasticsearch文档,并指定该类的实例应该存储在哪个索引中。
java 复制代码
import org.springframework.data.annotation.Document;

@Document(indexName = "my_index")
public class MyDocument {
    // 类成员
}

indexName:指定文档存储的索引名称。

  1. @Id 注解
    @Id注解用于标识文档的唯一标识符字段。
java 复制代码
import org.springframework.data.annotation.Id;

public class MyDocument {
    @Id
    private String id;

    // 其他字段和方法
}

@Id:标记字段作为文档的ID。

  1. @Field 注解

@Field注解用于指定字段的映射类型和名称。

java 复制代码
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

public class MyDocument {
    @Field(type = FieldType.Text)
    private String content;

    // 其他字段和方法
}

type:指定字段的Elasticsearch映射类型,如FieldType.Text、FieldType.Date等。

name:指定字段在Elasticsearch中的名称,默认使用Java字段名。

  1. @Fields 注解

@Fields注解用于定义多个字段,通常用于复杂类型或嵌套对象。

java 复制代码
import org.springframework.data.elasticsearch.annotations.Fields;

public class MyDocument {
    @Fields({
        @Field(name = "first_name", type = FieldType.Text),
        @Field(name = "last_name", type = FieldType.Keyword)
    })
    private Name name;

    // 其他字段和方法
}

public class Name {
    private String firstName;
    private String lastName;
}
  1. @MultiField 注解
    @MultiField注解用于创建包含多个字段的复合字段,例如,一个主字段和一个用于排序的子字段。
java 复制代码
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.FieldType;

public class MyDocument {
    @MultiField(mainField = @Field(type = FieldType.Text), subFields = {
        @Field(name = "raw", type = FieldType.Keyword)
    })
    private String name;

    // 其他字段和方法
}
  1. @GeoPoint 注解
    @GeoPoint注解用于标记地理位置字段。
java 复制代码
import org.springframework.data.elasticsearch.annotations.GeoPoint;
import org.springframework.data.elasticsearch.annotations.Field;

public class MyDocument {
    @GeoPoint
    @Field(type = FieldType.GeoPoint)
    private String location;

    // 其他字段和方法
}
  1. @Completion 注解
    @Completion注解用于标记Elasticsearch的完成建议字段。
java 复制代码
import org.springframework.data.elasticsearch.annotations.Completion;

public class MyDocument {
    @Completion
    private String suggestion;

    // 其他字段和方法
}
  1. @DateTimeFormat 注解
    @DateTimeFormat注解用于指定日期字段的格式。
java 复制代码
import org.springframework.data.elasticsearch.annotations.DateTimeField;
import org.springframework.data.elasticsearch.annotations.DateTimeFormat;
import java.time.LocalDateTime;

public class MyDocument {
    @DateTimeField(format = DateTimeFormat.ofPattern("yyyy-MM-dd HH:mm:ss"))
    private LocalDateTime timestamp;

    // 其他字段和方法
}
  1. @Version 注解
    @Version注解用于标记文档的版本字段。
java 复制代码
import org.springframework.data.annotation.Version;

public class MyDocument {
    @Version
    private Long version;

    // 其他字段和方法
}
  1. @Score 注解
    @Score注解用于标记查询得分字段。
java 复制代码
import org.springframework.data.elasticsearch.annotations.Score;

public class MyDocument {
    @Score
    private Double score;

    // 其他字段和方法
}

这些注解共同构成了Spring Data Elasticsearch中文档实体类的框架,允许您以声明式的方式定义文档的结构和特性。通过这些注解,您可以轻松地将Java对象映射到Elasticsearch文档,并利用Spring Data Elasticsearch提供的Repository抽象来执行CRUD操作。

java 复制代码
/**
 * 搜索数据 索引
 *
 * @author leon
 * @date 2024-11-21 16:16:54
 */
@Document(indexName = "search_data_index")
@Data
public class SearchDataDoc {

    /**
     * id 标识
     */
    @Id
    private Long id;
    
    /**
     * 名称
     */
    private String name;

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

    /**
     * 创建时间
     */
    @Field(type = FieldType.Date)
    private Date createdTime;

    /**
     * 修改时间
     */
    @Field(type = FieldType.Date)
    private Date modifiedTime;

}

定义操作文档的 CURD 仓库类

java 复制代码
@Repository
public interface SearchDataDocRepository extends ElasticsearchRepository<SearchDataDoc, Long> {
}

实际使用

主要会使用到两种 第一个是 ElasticsearchOperations 引入spring data es starter 直接注入即可使用

ElasticsearchOperations 是 Spring Data Elasticsearch 提供的一个核心接口,它封装了与 Elasticsearch 交互的常用操作。这个接口继承自 ElasticsearchOperations,提供了一组丰富的方法,允许你在应用程序中执行各种 Elasticsearch 查询和操作。以下是 ElasticsearchOperations 接口的一些关键功能:

1.索引管理

createIndex(String indexName):创建一个新的索引。

deleteIndex(String indexName):删除一个索引。

indexExists(String indexName):检查索引是否存在。

2.文档操作

index(String indexName, String documentId, String documentSource):向指定索引添加或更新文档。

get(String indexName, String documentId, Class clazz):根据 ID 获取文档。

delete(String indexName, String documentId):根据 ID 删除文档。

3.查询执行

query(String query, Class clazz):执行一个 Elasticsearch 查询,并返回结果集。

query(String query, String indexName, Class clazz):在指定索引上执行查询。

4.批量操作

bulkIndex(List queries):执行批量索引操作。

bulkDelete(List queries):执行批量删除操作。

5.搜索和聚合

search(String query, String indexName, Class clazz):在指定索引上执行搜索查询。

searchAggregations(String query, String indexName, Class clazz):执行聚合查询。

6.更新文档

update(String indexName, String documentId, String scriptSource):使用脚本更新文档。

7.索引别名管理

createAlias(String aliasName, String indexName):创建索引别名。

deleteAlias(String aliasName):删除索引别名。

8.索引刷新和优化

refreshIndex(String indexName):刷新索引,使最近的更改对搜索可见。

optimizeIndex(String indexName):优化索引,合并分片中的段。

9.健康检查和状态查询

clusterHealth():获取集群健康状态。

indexStatus(String indexName):获取索引状态。

第二种是文档类对应的操作类型 例如 本文中 文档类是 SearchDataDoc 对应的仓库类为 SearchDataDocRepository

java 复制代码
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SearchDataServiceTest {

    @Autowired
    private ElasticsearchOperations operations;

    @Autowired
    private SearchDataDocRepository searchDataDocRepository;

    
    @Test
    public void insert() {
        SearchDataDoc searchDataDoc = new SearchDataDoc();
        searchDataDoc.setId(1L);
        searchDataDoc.setName("test");
        searchDataDoc.setCreatedTime(new Date());
        searchDataDoc.setModifiedTime(new Date());
        searchDataDocRepository.save(searchDataDoc);
    }

    @Test
    public void update() {
        Optional<SearchDataDoc> opt = searchDataDocRepository.findById(1L);
        if (opt.isPresent()) {
            SearchDataDoc searchDataDoc = opt.get();
            searchDataDoc.setName("测试 的商品");
            SearchDataDoc save = searchDataDocRepository.save(searchDataDoc);
            System.out.println(save.getName());
        }
    }


    @Test
    public void delete() {
        searchDataDocRepository.deleteById(1L);
    }

    @Test
    public void operateIndex() {
        // 删除索引
        boolean delete = operations.indexOps(SearchDataDoc.class).delete();
        // 创建索引
        boolean create = operations.indexOps(SearchDataDoc.class).create();
        // 刷新
        operations.indexOps(SearchDataDoc.class).refresh();
        // 判断 索引是否存在 
        boolean exists = operations.indexOps(SearchDataDoc.class).exists();
    }
    
	@Test
    public void find() {
        // 条件查询
        CriteriaQuery criteriaQuery = new CriteriaQuery(
                new Criteria("name").in("test"));
        SearchHits<SearchDataDoc> search = operations.search(criteriaQuery, SearchDataDoc.class);
    }
}

运行测试类 完成验证


good day!!!

相关推荐
刘一说1 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
lang201509282 小时前
Spring Boot缓存机制全解析
spring boot·后端·缓存
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记29
java·spring boot·笔记
lang201509282 小时前
Spring Boot SQL数据库全攻略
数据库·spring boot·sql
是梦终空4 小时前
计算机毕业设计241—基于Java+Springboot+vue的爱心公益服务系统(源代码+数据库+11000字文档)
java·spring boot·vue·毕业设计·课程设计·毕业论文·爱心公益系统
扁豆的主人6 小时前
Elasticsearch
大数据·elasticsearch·jenkins
泉城老铁7 小时前
springboot 对接发送钉钉消息,消息内容带图片
前端·spring boot·后端
qq_12498707537 小时前
基于Spring Boot的高校实习实践管理系统(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
韩宁羽7 小时前
SpringBoot开发双11商品服务系统[完结19章]
spring boot
5pace10 小时前
【JavaWeb|第二篇】SpringBoot篇
java·spring boot·后端