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 结合DocumentOperationsSearchOperations的接口
  • ElasticsearchRestTemplateElasticsearchOperations的实现类

日常使用时,使用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注解内的createIndextrue时(默认为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);
相关推荐
Json____几秒前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
monkey_meng20 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss29 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
大鲤余1 小时前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust
她说彩礼65万1 小时前
Asp.NET Core Mvc中一个视图怎么设置多个强数据类型
后端·asp.net·mvc
河岸飞流1 小时前
Centos安装Elasticsearch教程
elasticsearch·centos
陈随易1 小时前
农村程序员-关于小孩教育的思考
前端·后端·程序员
_江南一点雨1 小时前
SpringBoot 3.3.5 试用CRaC,启动速度提升3到10倍
java·spring boot·后端
转转技术团队1 小时前
空间换时间-将查询数据性能提升100倍的计数系统实践
java·后端·架构
深情废杨杨1 小时前
后端-实现excel的导出功能(超详细讲解)
java·spring boot·excel