1、引入Jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2、配置ES连接信息
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
的分析器进行文本分析,
@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;
}
}
public interface UserRepository extends ElasticsearchRepository<User, String> {
// 可以添加自定义查询方法,但此处无需额外定义,仅使用基础CRUD即可
}
@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)
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);
}
@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);
}
@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篇-****博客