摘要:本文手把手教你如何在Spring Boot项目中整合Elasticsearch(ES),并实现基本的CRUD与搜索操作。包含版本选择、配置、代码示例及常见问题解决。
一、环境准备
1.1 软件版本
- Spring Boot: 3.x
- Elasticsearch: 8.x(推荐8.9+)
- JDK: 17+
二、配置Elasticsearch连接
2.1 配置文件
在application.yml
中添加:
yaml
spring:
elasticsearch:
uris: http://localhost:9200 # ES地址
username: elastic # 若开启安全认证
password: your_password
2.2 解决版本兼容问题
Spring Boot 3.x默认支持ES 8.x,无需额外配置。
⚠️ 若版本不匹配,可添加依赖:
xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>8.9.0</version>
</dependency>
三、核心代码实现
3.1 创建实体类
java
@Data
@Document(indexName = "article")
public class Article {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Keyword)
private String author;
@Field(type = FieldType.Integer)
private Integer views;
}
@Document
: 指定索引名称@Field
: 定义字段类型(Text支持分词,Keyword精确匹配)
3.2 创建Repository接口
java
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
// 自定义方法:根据标题搜索
List<Article> findByTitle(String title);
// 复杂查询示例
@Query("{\"match\": {\"title\": \"?0\"}}")
Page<Article> customSearch(String keyword, Pageable pageable);
}
四、基础操作示例
4.1 保存/更新数据
java
@Autowired
private ArticleRepository repository;
public void saveArticle() {
Article article = new Article();
article.setTitle("SpringBoot整合ES指南");
article.setAuthor("CSDN博主");
article.setViews(1000);
repository.save(article);
}
4.2 查询数据
java
// 根据ID查询
Optional<Article> article = repository.findById("1");
// 自定义方法查询
List<Article> list = repository.findByTitle("指南");
// 分页查询
Page<Article> page = repository.customSearch("SpringBoot", PageRequest.of(0, 10));
4.3 删除数据
java
repository.deleteById("1");
// 或删除全部
repository.deleteAll();
五、复杂查询实践
5.1 使用NativeQuery构建查询
java
Query query = NativeQuery.builder()
.withQuery(q -> q.match(m -> m.field("title").query("SpringBoot")))
.withPageable(PageRequest.of(0, 5))
.build();
SearchHits<Article> hits = elasticsearchOperations.search(query, Article.class);
5.2 组合查询(BoolQuery)
java
Query boolQuery = NativeQuery.builder()
.withQuery(q -> q
.bool(b -> b
.must(m -> m.match(m1 -> m1.field("title").query("指南")))
.filter(f -> f.range(r -> r.field("views").gte(100)))
)
).build();
六、常见问题解决
6.1 连接失败
- 检查ES是否启动(
http://localhost:9200
) - 确认
spring.elasticsearch.uris
配置正确
6.2 字段类型不匹配
- 删除旧索引,让Spring Boot自动创建新映射
- 或手动创建索引并指定mapping
6.3 中文分词失效
- 安装IK分词器到ES插件目录
- 实体类字段添加
analyzer = "ik_max_word"
七、总结
本文实现了:
- Spring Boot与ES 8.x的整合
- 基础的CRUD操作
- 自定义查询与分页
- 中文分词配置
注意事项:
- ES 8.x默认开启安全认证,测试时可暂时关闭(修改
elasticsearch.yml
) - 生产环境建议手动管理索引映射
- 复杂查询推荐使用
ElasticsearchRestTemplate