必须使用 Spring Data Elasticsearch 5.3.2 与 Elasticsearch 8.15.0/8.15.1 组合,配置 TLS+API key 认证,定义 IK 分词器的 @Document 实体,通过 SearchHits 获取高亮结果,启动时自动创建索引并验证中文全文检索。

要在 SpringBoot 4.7 中完成 Elasticsearch 搜索引擎集成并实现可运行的全文检索功能,必须严格匹配 Spring Data Elasticsearch 5.3+ 与 Elasticsearch 8.15+ 的版本组合,否则启动时会因客户端协议变更直接抛出 java.lang.NoClassDefFoundError: co/elastic/clients/elasticsearch/_types/analysis/CustomAnalyzer 类缺失异常。
确认版本兼容性
SpringBoot 4.7 不再支持旧版 Transport Client 或 RestHighLevelClient,仅兼容基于 Elasticsearch Java API Client(v8.15+)的 Spring Data Elasticsearch 5.3.x。打开 pom.xml,检查以下依赖是否精确匹配:
【必须使用 spring-data-elasticsearch 5.3.2,不可用 5.2.x 或 5.4.x】
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>5.3.2</version>
</dependency>
同时确保本地 Elasticsearch 实例为 8.15.0 或 8.15.1 —— 8.16.0 已移除 _search?typed_keys 兼容入口,会导致 ElasticsearchException: [illegal_argument_exception] unknown parameter [typed_keys] 报错。
配置 Elasticsearch 连接
在 application.yml 中启用 TLS 认证和 API key 认证双模式(Elasticsearch 8.15 默认强制启用安全模块):
spring:
elasticsearch:
uris: https://localhost:9200
username: elastic
password: ${ES_PASSWORD:changeme}
client:
reactive: false
rest:
connection-timeout: 5000
read-timeout: 15000
注意:若跳过证书校验(仅限开发),需额外添加 JVM 参数:-Djavax.net.ssl.trustStore=/dev/null -Djavax.net.ssl.trustStorePassword=changeit,否则会卡在 SSLHandshakeException。
定义文档实体与分词策略
方法一:使用 @Document 声明索引并绑定 IK 分词器(需提前在 ES 8.15 中安装 ik 插件 v8.15.0)
@Document(indexName = "articles")
public class Article {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String content;
@Field(type = FieldType.Keyword)
private String author;
}
方法二:若不依赖 IK,改用内置 standard 分词器,但中文检索效果将严重劣化——例如搜索“人工智能”无法命中含“AI”或“智能”的文档。
编写 Repository 接口与高亮查询
第一步:继承 ElasticsearchRepository 并声明自定义方法
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
List<Article> findByTitleContaining(String keyword);
@Query("{\"query\":{\"match\":{\"title\":{\"query\":\"?0\",\"analyzer\":\"ik_smart\"}}},\"highlight\":{\"fields\":{\"title\":{}}}}")
SearchHits<Article> searchWithHighlight(String keyword);
}
第二步:在 Service 层调用高亮结果解析
SearchHits<Article> hits = articleRepository.searchWithHighlight("机器学习");
for (SearchHit<Article> hit : hits) {
Map<String, List<String>> highlight = hit.getHighlightFields();
if (highlight.containsKey("title")) {
String highlighted = highlight.get("title").get(0); // 取第一个高亮片段
System.out.println(highlighted);
}
}
这一步必须用 SearchHits 而非 List,否则高亮字段不会被注入到返回对象中。
启动应用并验证索引自动创建
1. 启动 SpringBoot 应用,观察控制台日志:
✅ 出现 Created index 'articles' with settings {...} 表示映射成功
❌ 若报错 index_not_found_exception,说明 @Document 中的 indexName 值未被识别,检查类是否被 ComponentScan 扫描到
2. 向 http://localhost:9200/articles/_doc POST 一条测试数据(Content-Type: application/json):
{ "id": "1", "title": "SpringBoot 集成 Elasticsearch 全文检索实战", "content": "本文详解 SpringBoot 4.7 如何对接 Elasticsearch 8.15 实现毫秒级中文搜索", "author": "dev" }
3. 发起 GET 请求:http://localhost:8080/api/search?q=全文检索,响应体中应包含 "highlight":{"title":["SpringBoot 集成 Elasticsearch <em>全文检索</em>实战"]}

















