1. 概述
在这篇文章中,我们将以实践的方式探讨Spring Data Solr的基础知识。
Apache Solr是一个开源的、即插即用的企业级全文搜索引擎。有关Solr功能的更多信息,请访问官方网站。
我们将展示如何进行简单的Solr配置,当然还有如何与服务器交互。
首先,我们需要启动一个Solr服务器,并创建一个核心来存储数据(默认情况下,Solr会以无模式方式创建数据)。
2. Spring Data
就像其他任何Spring Data项目一样,Spring Data Solr的目标是消除样板代码,我们肯定会利用这一点。
2.1. Maven依赖
让我们先在pom.xml中添加Spring Data Solr的依赖:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>4.3.14</version>
</dependency>
您可以在这里找到最新的依赖。
2.2. 定义文档
现在定义一个名为Product的文档:
@SolrDocument(solrCoreName = "product")
public class Product {
@Id
@Indexed(name = "id", type = "string")
private String id;
@Indexed(name = "name", type = "string")
private String name;
}
@SolrDocument注解表示Product类是一个Solr文档,并且被索引到名为product的核心。被@Indexed注解标记的字段将在Solr中被索引并可搜索。
2.3. 定义仓库接口
接下来,我们需要创建一个仓库接口,通过扩展Spring Data Solr提供的仓库。我们将自然地使用Product和String作为我们的实体ID:
public interface ProductRepository extends SolrCrudRepository<Product, String> {
public List<Product> findByName(String name);
@Query("id:*?0* OR name:*?0*")
public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);
@Query(name = "Product.findByNamedQuery")
public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);
}
请注意,除了SolrCrudRepository提供的API之外,我们在这里定义了三个方法。在接下来的几节中,我们将讨论这些方法。
另外,请注意,Product.findByNamedQuery属性是在Solr命名查询文件solr-named-queries.properties中定义的,位于classpath文件夹中:
Product.findByNamedQuery=id:*?0* OR name:*?0*
2.4. Java配置
现在我们将探索Solr持久层的Spring配置:
@Configuration
@EnableSolrRepositories(
basePackages = "com.baeldung.spring.data.solr.repository",
namedQueriesLocation = "classpath:solr-named-queries.properties")
@ComponentScan
public class SolrConfig {
@Bean
public SolrClient solrClient() {
return new HttpSolrClient.Builder("http://localhost:8983/solr").build();
}
@Bean
public SolrTemplate solrTemplate(SolrClient client) throws Exception {
return new SolrTemplate(client);
}
}
我们使用@EnableSolrRepositories来扫描包中的仓库。请注意,我们指定了命名查询属性文件的位置,并启用了多核心支持。
如果没有启用多核心,那么默认情况下,Spring Data将假设Solr配置适用于单个核心。这里只是为了参考,我们启用了多核心。
3. Spring Data Solr与Spring Boot
在这一节,我们将看看在Spring Boot应用中的设置是什么样的。
首先,在pom.xml中添加Spring Boot Starter Data Solr的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.12</version>
</dependency>
您可以在这里找到最新版本的依赖。
我们还需要在application.properties文件中定义属性spring.data.solr.host,其值为Solr的URL:
spring.data.solr.host=http://localhost:8983/solr
确保Solr正在指定的URL上运行。
由于在类路径中有启动器,因此这已经设置了Spring Data Solr在Spring Boot应用中的所有配置。
4. 索引、更新和删除
为了在Solr中搜索文档,文档需要被索引到Solr仓库。
以下示例通过调用SolrCrudRepository's的save方法,简单地将产品文档索引到Solr仓库:
Product phone = new Product();
phone.setId("P0001");
phone.setName("Phone");
productRepository.save(phone);
现在,让我们检索并更新一个文档:
Product retrievedProduct = productRepository.findById("P0001").get();
retrievedProduct.setName("Smart Phone");
productRepository.save(retrievedProduct);
文档可以通过简单调用delete方法来删除:
productRepository.delete(retrievedProduct);
5. 查询
现在,让我们探索Spring Data Solr API提供的不同查询技术。
5.1. 方法名查询生成
基于方法名称的查询是通过解析方法名称来生成预期执行的查询:
public List<Product> findByName(String name);
在我们的仓库接口中,我们有findByName方法,它根据方法名称生成查询:
List<Product> retrievedProducts = productRepository.findByName("Phone");
5.2. 使用@Query注解的查询
Solr搜索查询可以通过在方法上的@Query注解中包含查询来创建。例如,findByCustomQuery方法被@Query注解:
@Query("id:*?0* OR name:*?0*")
public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);
让我们使用这个方法获取文档:
Page<Product> result
= productRepository.findByCustomQuery("Phone", PageRequest.of(0, 10));
通过调用*findByCustomQuery(“Phone”, PageRequest.of(0, 10))*,我们可以获取包含字段"id"或"name"中包含“Phone”字样的产品文档的第一页。
5.3. 命名查询
命名查询类似于带有@Query注解的查询,只是查询声明在一个单独的属性文件中:
@Query(name = "Product.findByNamedQuery")
public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);
如果属性文件中的查询键(例如findByNamedQuery)与方法名称匹配,那么@Query注解就不是必需的。
让我们使用命名查询方法获取一些文档:
Page<Product> result
= productRepository.findByNamedQuery("one", PageRequest.of(0, 10));
6. 总结
本文是Spring Data Solr的快速实用指南,涵盖了基本配置、定义仓库以及查询的基本内容。如往常一样,这里使用的示例可在GitHub上的样本项目中找到。