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博客

相关推荐
奋斗的小花生12 分钟前
c++ 多态性
开发语言·c++
魔道不误砍柴功14 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_23414 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨17 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程1 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉