spring boot集成elasticsearch推荐使用spring data elasticsearch 4.0+,通过添加依赖、配置连接、定义@document实体、继承elasticsearchrepository及用nativesearchquerybuilder构建dsl查询实现全文检索。

在 Spring Boot 中集成 Elasticsearch 实现全文检索,核心是使用 Spring Data Elasticsearch(推荐 4.0+ 版本,适配 Elasticsearch 7.x/8.x),它提供 Repository 抽象、自动索引管理、条件查询和高亮等能力,比直接用 RestHighLevelClient 更简洁高效。
1. 添加依赖(Maven)
根据你用的 Elasticsearch 服务版本选对应客户端:
- ES 7.x → 使用
spring-boot-starter-data-elasticsearch(内置 Jest 或 REST client,默认为 RestHighLevelClient) - ES 8.x → 推荐升级到 Spring Data Elasticsearch 5.x(需 Spring Boot 3.x + Jakarta EE 9+);若用 Spring Boot 2.7.x,可搭配 ES 7.17 兼容版
以 Spring Boot 2.7.x + ES 7.17 为例,在 pom.xml 中添加:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-data-elasticsearch</artifactid></dependency>
2. 配置 Elasticsearch 连接
在 application.yml 中配置连接信息(注意:ES 7.x 默认关闭 HTTP 基础认证,如开启 X-Pack 安全功能需加用户名密码):
spring:
elasticsearch:
rest:
uris: http://localhost:9200
username: elastic
password: changeme
若用本地单节点开发且未启用安全功能,可省略 username/password;若用 Docker 启动 ES,请确保网络互通(如同属 default 网络或 host 模式)。
3. 定义实体与索引映射
用 @Document 标注实体类,指定索引名、分片数、刷新间隔等;字段用 @Field 控制类型(text / keyword / date / long 等)和分词行为:
示例:商品搜索实体
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
@Document(indexName = "product", shards = 1, replicas = 0)
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private Double price;
@Field(type = FieldType.Date, format = DateFormat.date_optional_time)
private LocalDateTime createTime;
// getter/setter...
}
⚠️ 注意:analyzer = "ik_max_word" 表示使用 IK 分词器(需提前在 ES 中安装 ik 插件并重启);若未安装,改用默认 standard 分词器。
4. 创建 Repository 并使用查询
继承 ElasticsearchRepository 即可获得基础 CRUD 和派生查询能力:
public interface ProductRepository extends ElasticsearchRepository<product string> {
List<product> findByTitleContaining(String keyword);
Page<product> findByCategoryAndPriceBetween(String category, double min, double max, Pageable pageable);
}</product></product></product>
更灵活的全文检索建议用 NativeSearchQueryBuilder 构建 DSL 查询,支持布尔查询、高亮、聚合等:
@Service
public class ProductService {
@Autowired private ProductRepository repository;
public SearchHits<product> searchWithHighlight(String keyword) {
Query query = NativeSearchQueryBuilder
.withQuery(matchQuery("title", keyword).operator(Operator.AND))
.withHighlightFields(
HighlightBuilder.Field.builder("title").fragmentSize(100).numOfFragments(1)
)
.build();
return operations.search(query, Product.class, IndexCoordinates.of("product"));
}
}</product>
其中 operations 是 ElasticsearchOperations(自动注入),可用于执行原生查询、批量写入、索引创建等操作。
5. 初始化索引(可选但推荐)
首次启动时自动创建索引和 mapping,可在启动类中调用:
@PostConstruct
public void initIndex() {
IndexOperations indexOps = operations.indexOps(Product.class);
if (!indexOps.exists()) {
indexOps.create();
indexOps.putMapping(indexOps.createMapping(Product.class));
}
}
注意:mapping 一旦创建就不能修改字段类型,新增字段可动态添加;如需重建索引,建议用 reindex API 或删除后重建(开发环境可用 indexOps.delete())。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










