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);
相关推荐
刘大辉在路上2 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
it噩梦3 小时前
es 中 terms set 使用
大数据·elasticsearch
追逐时光者4 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~5 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581365 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳5 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾5 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
黑胡子大叔的小屋5 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
喝醉酒的小白6 小时前
Elasticsearch 配置文件
大数据·elasticsearch·搜索引擎