SpringBoot整合ElasticSearch

目录

一、版本对应关系

二、导入依赖

三、配置

1、application.yml

2、Bean

3、日志输出

四、实体映射

五、CRUD

1、操作索引

2、条件搜索

六、ElasticsearchRepository

1、新建一个Model的数据持久层

2、默认的CRUD示例


一、版本对应关系

Spring Boot Spring Data Elasticsearch Elasticsearch
2.4.x 4.1.x 7.9.x
2.5.x 4.2.x 7.12.x
2.6.x 4.3.x 7.15.x
2.7.x 4.4.x 7.17.x

本系统使用的spring boot版本为2.6.13,ElasticSearch版本是7.16.2

二、导入依赖

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

三、配置

1、application.yml

官网未介绍yml方式配置,但是也是可以使用的,不做复杂的设置的话,yml即可

java 复制代码
# yml配置elasticsearch客户端地址(可配置项有限)
spring:
  elasticsearch:
    uris: http://127.0.0.1:9200 # elasticsearch 连接地址
    #username: elastic # 用户名
    #password: 123456 # 密码
    connection-timeout: 10s # 连接超时时间(默认1s)
    socket-timeout: 30s # 数据读取超时时间(默认30s)

2、Bean

java 复制代码
import org.elasticsearch.client.RestHighLevelClient;
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;

import java.time.Duration;

/**
 * @Author:jackma
 * @name:RestClientConfig
 * @Date:2024/7/20 22:32
 */
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
    @Bean
    @Override
    public RestHighLevelClient elasticsearchClient() {
        // 使用构建器来提供集群地址,设置默认值HttpHeaders或启用SSL。
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                // 设置连接地址
                .connectedTo("192.168.58.131:9200")
                // 可以设置多个地址
                // .connectedTo("127.0.0.1:9200", "127.0.0.1:9201")
                // 是否启用ssl
                // .usingSsl()
                // 设置连接超时时间
                .withConnectTimeout(Duration.ofSeconds(10))
                // 设置
                .withSocketTimeout(Duration.ofSeconds(30))
                // 设置用户名密码
                // .withBasicAuth("elastic", "123456")
                // 创建连接信息
                .build();
        // 创建RestHighLevelClient。
        return RestClients.create(clientConfiguration).rest();
    }
}

3、日志输出

java 复制代码
logging:
  file:
    name: ./log/log.log
  level:
    root: info
    org.springframework.data.elasticsearch.client.WIRE: trace

四、实体映射

java 复制代码
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 商品表
 * @TableName sys_model
 */
@TableName(value ="sys_model")
@Data
@Document(indexName = "sys_model")
public class Model implements Serializable {
    /**
     * 主键
     */
    @Id
    @TableId(value = "sys_id")
    @Field(type = FieldType.Keyword)
    private String sysId;

    /**
     * 对象Id
     */
    @TableField(value = "object_id")
    @Field(type = FieldType.Keyword)
    private String objectId;

    /**
     * 商品订单号
     */
    @TableField(value = "out_trade_no")
    @Field(type = FieldType.Keyword)
    private String outTradeNo;

    /**
     * 金额
     */
    @TableField(value = "total_amount")
    @Field(type = FieldType.Keyword)
    private String totalAmount;

    /**
     * 商品名称
     */
    @TableField(value = "subject")
    @Field(type = FieldType.Text)
    private String subject;

    /**
     * 是否支付 0 已支付 1未支付
     */
    @TableField(value = "is_pay")
    @Field(type = FieldType.Integer)
    private Integer isPay;

    /**
     * 是否有效
     */
    @TableField(value = "active")
    @Field(type = FieldType.Integer)
    private Integer active;

    /**
     * 创建时间
     */
    @TableField(value = "create_time")
    @Field(type = FieldType.Date)
    private LocalDate createTime;

    /**
     * 修改时间
     */
    @TableField(value = "update_time")
    @Field(type = FieldType.Date)
    private LocalDate updateTime;

    /**
     * 创建人
     */
    @TableField(value = "create_by")
    @Field(type = FieldType.Keyword)
    private String createBy;

    /**
     * 修改然
     */
    @TableField(value = "update_by")
    @Field(type = FieldType.Keyword)
    private String updateBy;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

以下是对注释的讲解

java 复制代码
@Document :
应用于类级别,表示该类是映射到数据库的候选对象。
重要属性:
indexName :存储此实体的索引名称,可包含 SpEL 模板表达式。
createIndex :标记在存储库引导中是否创建索引,默认值为 true 。
versionType :版本管理的配置,默认值为 EXTERNAL 。
@Id :
应用于字段级别,标记用于标识目的的字段。
@Transient :
应用于字段,默认情况下所有字段都映射到文档,该注释使此字段不被包含。
@PersistenceConstructor :
标记从数据库实例化对象时要使用的给定构造函数,参数按名称映射到检索到的文档中的键值。
@Field :
应用于字段级别,定义字段属性。
属性包括:
name :字段在 Elasticsearch 文档中的名称,未设置时使用 Java 字段名称。
type :字段类型,如多种类型可选。
format 和日期类型的 pattern :日期类型必须定义。
store :标记是否存储原始字段值,默认值为 false 。
analyzer 、 searchAnalyzer 、 normalizer :用于指定自定义分析和正规化。
@GeoPoint :
将字段标记为 geo_point 数据类型,若字段是 GeoPoint 类实例可省略。
@ValueConverter :
定义用于转换给定属性的类,仅转换带注释的属性。
@Setting :
定义不同的索引设置。
参数包括:
useServerConfiguration :不发送任何设置参数,由 Elasticsearch 服务器配置确定。
settingPath :指定义必须在类路径中解析的设置的 JSON 文件。
shards :要使用的分片数,默认为 1 。
replicas :副本数,默认为 1 。
refreshIntervall :默认为 1s 。
indexStoreType :默认为 fs 。

五、CRUD

主要有以下4个类

  • IndexOperations 在索引级别定义操作,例如创建或删除索引。
  • DocumentOperations 定义根据其ID存储,更新和检索实体的操作。
  • SearchOperations 定义使用查询搜索多个实体的动作
  • ElasticsearchOperations 结合DocumentOperations和SearchOperations的接口
  • ElasticsearchRestTemplate 是ElasticsearchOperations的实现类

日常使用时,使用ElasticsearchRestTemplate即可,代码如下

java 复制代码
@Autowired
private ElasticsearchRestTemplate template;

1、操作索引

java 复制代码
// 获取IndexOperations对象
IndexOperations indexOperations = template.indexOps(Model.class);
// 查
boolean exists = indexOperations.exists();
// 删
boolean delete = indexOperations.delete();
// 增
boolean flag = indexOperations.create();
// 设置Mapping
boolean mapping = indexOperations.putMapping();

2、条件搜索

使用 QueryBuilder 完成各种条件查询的示例

java 复制代码
@Test
    void getInfoByCondition() {
        // 创建一个 matchAllQuery
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

        // 条件查询:精确匹配
        QueryBuilder exactMatchQuery = QueryBuilders.termQuery("fieldName", "value");

        // 条件查询:范围匹配
        QueryBuilder rangeQuery = QueryBuilders.rangeQuery("numericField")
                .from(10)
                .to(20);

        // 条件查询:短语匹配
        QueryBuilder phraseMatchQuery = QueryBuilders.matchPhraseQuery("textField", "phrase");

        // 条件查询:布尔查询
        QueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("field1", "value1"))
                .mustNot(QueryBuilders.termQuery("field2", "value2"))
                .should(QueryBuilders.termQuery("field3", "value3"));

        // 条件查询:模糊匹配
        QueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("fieldName", "value");

        // 将查询构建器添加到搜索源构建器中
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
    }

六、ElasticsearchRepository

一个类似于Spring Data JPA的文档操作方法

1、新建一个Model的数据持久层

java 复制代码
package com.elasticsearch.repository;

import com.elasticsearch.domain.Model;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 * @Author:jackma
 * @name:ModelRepository
 * @Date:2024/7/20 22:36
 */
@Repository
public interface ModelRepository extends ElasticsearchRepository<Model,String> {
}

建立此持久层后,如果User实体@Document注解内的createIndex为true时(默认为true),则服务启动时会先检查索引是否存在,若不存在则会自动创建索引

2、默认的CRUD示例

java 复制代码
// 增/改
Model model = new Model(1, "张三", 18, "上海市闵行区", LocalDateTime.now());
Model save = repository.save(model);

// 查
Optional<Model> optionalModel = repository.findById(1);

// 删
repository.deleteById(1);
相关推荐
养军博客27 分钟前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
IT_陈寒32 分钟前
SpringBoot实战技巧总结
前端·人工智能·后端
Elasticsearch34 分钟前
对 OpenTelemetry Kafka 接收器的两项改动,避免一个缓慢的租户拖住其他租户
elasticsearch
TeamDev35 分钟前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
量化分析码农1 小时前
【Python量化多因子实战 05】因子也会轮动:因子动量与因子反转的择时应用
后端
陈随易2 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
金銀銅鐵10 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
陈随易11 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
txxzjmzlh12 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj52014 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试