必须降级Solr至7.7.3或强制指定低版本SolrJ,因Spring Boot 2.1.x内置solr-solrj 7.5.x与Solr 8.x/9.x不兼容,否则启动报NoClassDefFoundError。

要在Spring Boot 2.1项目中快速启用企业级全文搜索能力,必须正确集成Solr并确保索引、查询、高亮等核心功能可立即调用,不能只停留在依赖引入层面。
确认Solr服务已就绪并可访问
打开浏览器访问 http://localhost:8983/solr,看到管理界面即表示Solr进程正常运行。若页面打不开,先检查是否执行过 solr start 命令,且端口8983未被占用。
在左侧 Core Admin 页面点击 Add Core,输入 name 和 instanceDir 均为 product_core(名称必须一致),点击添加。这一步失败常见原因是 server/solr/product_core/conf 目录缺失——此时需手动将 server/solr/configsets/_default/conf 全量复制过去。
创建成功后,在 Core Selector 下拉框中能看到 product_core,说明物理索引实例已就位。
引入Spring Data Solr Starter依赖
在 pom.xml 的 <dependencies> 中添加:
<dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-data-solr</artifactId><br></dependency>
注意:Spring Boot 2.1.x 对应的 spring-boot-starter-data-solr 实际绑定的是 solr-solrj 7.5.x 版本,与 Solr 8.x 服务端不兼容。若你本地 Solr 是 8.x 或 9.x,请降级 Solr 到 7.7.3 或修改依赖强制指定低版本 SolrJ,否则启动时会报 NoClassDefFoundError: org/apache/solr/client/solrj/impl/CloudSolrClient。
配置Solr连接参数
在 application.yml 中写入:
spring:<br> data:<br> solr:<br> host: http://localhost:8983/solr/product_core
这一行必须严格匹配你创建的 core 名称,末尾不能带斜杠,也不能拼错大小写。填成 productcore 或 Product_Core 都会导致 SolrClient 初始化失败,应用启动直接抛出 HttpClientErrorException。
无需额外配置 SolrTemplate Bean,Spring Boot 2.1 自动装配,但前提是上面的 URL 可 ping 通且返回 HTTP 200。
定义可索引的实体类
新建 Product.java,必须满足三个硬性条件:
① 实现 Serializable 接口;
② 每个字段加 @Field 注解,且注解值与 managed-schema 中定义的 field name 完全一致(例如 schema 里是 product_name,代码里就得写 @Field("product_name"));
③ 必须有一个字段标注 @Id,且该字段在 schema 中设为 required="true" 并 indexed="true"。
示例片段:
@Data<br>public class Product implements Serializable {<br> @Id<br> @Field("id")<br> private String id;<br><br> @Field("product_name")<br> private String name;<br><br> @Field("description")<br> private String desc;<br>}
编写Repository接口并测试索引
新建接口 ProductRepository,继承 SolrCrudRepository<Product, String>:
public interface ProductRepository extends SolrCrudRepository<Product, String> {<br> List<Product> findByNameContaining(String name);<br>}
在单元测试中注入该 Repository,调用 save() 方法插入一条数据:
Product p = new Product();<br>p.setId("P1001");<br>p.setName("无线蓝牙耳机");<br>p.setDesc("支持主动降噪,续航30小时");<br>repository.save(p);
执行后立刻去 Solr 管理界面的 Query 标签页,输入 q=id:P1001 → Submit,能查到结果才说明数据真正落库。如果查不到,大概率是实体字段名与 schema 不匹配,或 Solr 服务端未开启 autoCommit(需检查 solrconfig.xml 中 <autoCommit> 是否启用)。

















