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提供的仓库。我们将自然地使用ProductString作为我们的实体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上的样本项目中找到。