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

复制代码
------------------------------------------------
相关推荐
NGINX开源社区2 小时前
使用 NGINX 作为 AI Proxy
大数据·人工智能·nginx
cjy0001119 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
雪兽软件9 小时前
如何从目标到决策构建大数据战略?
大数据
sheji341610 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
数据皮皮侠10 小时前
中国城市间地理距离矩阵(2024)
大数据·数据库·人工智能·算法·制造
ToB营销学堂10 小时前
B2B营销自动化新解法:MarketUP聚焦高转化场景
大数据·运维·自动化
TK云大师-KK10 小时前
TikTok自动化直播遇到内容重复问题?这套技术方案了解一下
大数据·运维·人工智能·矩阵·自动化·新媒体运营·流量运营
程序员阿伦12 小时前
璋㈤鏈虹殑Java澶у巶闈㈣瘯璁帮細浠嶴pring Boot鍒癒ubernetes锛�3杞湡棰樺叏瑙f瀽锛�
spring boot·redis·kubernetes·aigc·java闈㈣瘯·寰湇鍔�·鐢靛晢绉掓潃
wuyikeer12 小时前
Spring BOOT 启动参数
java·spring boot·后端
zdl68613 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端