Java整合ElasticSearch8.13

1、引入Jar包

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

2、配置ES连接信息

XML 复制代码
spring:
  elasticsearch:
    # 地址
    uris: http://xxx:9200
    # 用户名
    username: xxx
    # 密码
    password: xxx
    # 连接超时时间
    connection-timeout: 5s
    # 数据读写超时时间
    socket-timeout: 10s
    # 如果Elasticsearch API路径有前缀,可以在此指定
    #path-prefix:

logging:
  level:
    # 输出es的查询参数(调试用)
    tracer: trace

3、实际使用案例

@Document:

1、indexName:指定实体类对应的Elasticsearch索引名称,如 indexName = "users"

@Field:

1、type:映射类型,包括text、boolean、date、Integer等

2、analyzer:分析器,用来指定分析类型,例如使用ik_max_word的分析器进行文本分析,

java 复制代码
@Data
@Document(indexName = "user")
public class User {

    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;

    @Field(type = FieldType.Integer)
    private int age;

    public User(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}
java 复制代码
public interface UserRepository extends ElasticsearchRepository<User, String> {
    // 可以添加自定义查询方法,但此处无需额外定义,仅使用基础CRUD即可
}
java 复制代码
 @Test
 void saveAll() {
        
      List<User> usersToImport = Arrays.asList(
      new User("user5", "Jack", 18),
      new User("user6", "Amy", 19));

      userRepository.saveAll(usersToImport);
 }

4、ElasticsearchRepository已经实现的基本CRUD和分页查询(也可直接使用ElasticsearchTemplate)

java 复制代码
T entity: 要搜索相似实体的参照实体。Elasticsearch会基于此实体的某些属性(见下文)来寻找相似的其他实体。

@Nullable String[] fields: 可选参数,表示用于计算相似度的实体属性列表。如果未指定,可能默认使用所有已索引的文本字段。这些字段通常包含具有相似性计算意义的文本内容。

Pageable pageable: 分页参数,用于控制查询结果的分页和排序。包含页码、每页大小以及排序规则等信息。

⚠️:
searchSimilar方法的核心功能是利用Elasticsearch的相似度搜索(如More Like This查询)来找出与给定实体在指定字段上具有较高相似度的其他实体。这种方法在推荐系统、相关文档检索、异常检测等领域非常有用。只需在自己的Repository接口中继承ElasticsearchRepository,就可以直接使用searchSimilar方法进行相似度搜索,而无需手动编写复杂的Elasticsearch查询DSL。

需要注意的是,实际使用时,确保参照实体的指定字段已正确映射到Elasticsearch并启用相似度计算功能(如使用合适的分析器、设置similarity属性等)。同时,ElasticsearchRepository及其提供的方法通常需要与Spring Data Elasticsearch的其他组件(如ElasticsearchTemplate、ElasticsearchConverter等)以及相应的配置一起使用,才能充分发挥其功能。


@NoRepositoryBean
public interface ElasticsearchRepository<T, ID> extends PagingAndSortingRepository<T, ID>, CrudRepository<T, ID> {
    Page<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable);
}
java 复制代码
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends Repository<T, ID> {
    
    //该方法用于查询所有实体,并按照指定的排序规则进行排序。
    //参数Sort代表排序条件,可以包含一个或多个排序字段及其排序方向(升序或降序)。
    //返回值是按指定排序规则排列的所有实体的迭代器。
    Iterable<T> findAll(Sort sort);


    /**
    该方法用于分页查询所有实体,并可选地进行排序。参数Pageable封装了分页和排序的相关信息,包括:
      页码 (page):当前请求的页数,从0开始计数。
      每页大小 (size):每页包含的实体数量。
      排序 (Sort):类似于上一个方法中的Sort参数,定义了排序字段和排序方向。

   返回值是Page<T>类型,它不仅包含了当前请求页的所有实体(可通过getContent()方法获取),还提供了   分页相关的元数据,如:
     总页数 (totalPages):基于总实体数和每页大小计算得出的总页数。
     总实体数 (totalElements):数据库中符合条件的实体总数。
     是否有下一页 (hasNext):判断是否还有下一页数据可供查询。
     是否有上一页 (hasPrevious):判断是否还有上一页数据可供查询。
     当前页码 (number):返回当前请求的页码。
     每页大小 (size):返回当前请求的每页大小。
     排序信息 (sort):返回当前请求的排序条件。
    */

    Page<T> findAll(Pageable pageable);

}
java 复制代码
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {

    //保存或更新一个实体。如果传入的实体对象有ID(即主键),且在数据库中已存在对应记录,则执行更新操作;否则插入新记录。返回值是保存后(可能经过转换或生成ID)的实体对象。
    <S extends T> S save(S entity);

    //批量保存或更新多个实体。对于每个实体,执行与save(S entity)相同的操作。返回值是包含所有保存后实体的迭代器
    <S extends T> Iterable<S> saveAll(Iterable<S> entities);

    //根据给定的ID查找实体。如果找到匹配的实体,返回封装在Optional中的实体对象;否则返回空Optional
    Optional<T> findById(ID id);

    //检查是否存在具有指定ID的实体。如果存在,返回true;否则返回false
    boolean existsById(ID id);

    //返回所有实体的集合。通常仅在数据量较小的情况下使用,否则可能导致内存溢出
    Iterable<T> findAll();
    
    //根据一组ID查找对应的实体集合。返回包含所有找到实体的迭代器
    Iterable<T> findAllById(Iterable<ID> ids);

    //返回实体总数
    long count();
    
    //根据指定ID删除对应的实体
    void deleteById(ID id);

    //删除传入的实体对象所对应的数据库记录
    void delete(T entity);
   
    //根据ID批量删除
    void deleteAllById(Iterable<? extends ID> ids);

    //批量删除传入的实体对象集合所对应的数据库记录
    void deleteAll(Iterable<? extends T> entities);

    //删除所有实体,清空整个实体表或集合
    void deleteAll();
}

关于ES的详解:这些年背过的面试题 ------ ES篇-CSDN博客

相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说7 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json