ES之三:springboot集成ES

一.选择版本很重要,不然会找不到好多方法

明明有Timeout方法,不报红,运行时,报错,找不到该类 ClassNotFoundException

为了避免使用的Elasticsearch版本和SpringBoot采用的版本不一致导致的问题,尽量使用一致的版本。下表是对应关系:
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

我的项目用的 springboot-2.7.7

三、ES Java API选择

1、JAVA客户端对比
  • transportclient:通过监听9300端口tcp进行数据传输,它可以触摸到es的API和结构,此客户端对ES的版本兼容性较差,并且它在高并发环境下会有性能问题。

  • restclient:restclient就是采用http协议进行交互,它相比transportclient最大的好处就是对ES版本兼容性较好。restclient也分为high-level和low-level两种,两者原理基本一致,区别最大的就是封装性。low-level各种操作都要你自己封装,并且java本身不支持json还需要引用第三方包。而high-level是针对elasticsearch的api进行高级封装,和elasticsearch的版本关联大一些。

2、依赖选择
  • spring-data-elasticsearch:spring官方提供的框架,使用起来非常方便,3.2.0 版本之前是基于transportclient封装的,在此之后是基于HighLevelRestClient进行封装的,因此建议使用3.2.0 及以后的版本。

  • spring-boot-starter-data-elasticsearch:springboot官方提供的客户端,内部使用spring-data-elasticsearch,springboot-2.2(对应spring-data-elasticsearch-3.2.0)

3、该如何选择客户端?
  • 若使用的是springboot项目(spring-boot-starter-data-elasticsearch启动器),建议使用springboot-2.2及以后版本
  • 若只是一个普通spring项目,使用spring-data-elasticsearch-3.2.0以后版本。
  • 若以上两种都不是,建议使用HighLevelRestClient,而非transportclient

四、实体映射

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;
}

以下是对注释的讲解

@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即可,代码如下

@Autowired
private ElasticsearchRestTemplate template;
1、操作索引
// 获取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 完成各种条件查询的示例

@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的数据持久层

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示例

// 增/改

Model model = new Model(1, "张三", 18, "上海市闵行区", LocalDateTime.now());

Model save = repository.save(model);

// 查

Optional optionalModel = repository.findById(1);

// 删

repository.deleteById(1);

------------------------------------------------
相关推荐
shuxianshrng17 分钟前
鹰眼降尘系统怎么样
大数据·服务器·人工智能·数码相机·物联网
优思学院21 分钟前
优思学院|如何从零开始自己学习六西格玛?
大数据·运维·服务器·学习·六西格玛黑带·cssbb
计算机程序设计开发23 分钟前
计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·课程设计·计算机毕业设计
骆晨学长25 分钟前
基于SpringBoot的校园失物招领系统
java·spring boot
计算机编程-吉哥28 分钟前
计算机毕业设计 二手图书交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
java·spring boot·毕业设计·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·二手图书交易系统
qq_353233538929 分钟前
【原创】java+springboot+mysql高校社团网系统设计与实现
java·spring boot·mysql
JermeryBesian36 分钟前
Flink系列知识之:Checkpoint原理
大数据·flink
lwprain37 分钟前
编写第一个hadoop3.3.6的mapreduce程序
大数据·mapreduce
2401_840192271 小时前
ELFK日志分析平台,架构和通信
elk·elasticsearch·架构
evanYang_1 小时前
Spring Boot配置文件敏感信息加密
spring boot·后端·oracle