Spring Data Solr简介

2023/05/18

1. 概述

在本文中,我们将以实用的方式探讨Spring Data Solr的基础知识

Apache Solr是一个开源的、可部署的企业全文搜索引擎。你可以在官方网站上找到有关Solr功能的更多信息。

我们将展示如何进行简单的Solr配置,当然还有如何与服务器交互。

首先,我们需要启动一个Solr服务器并创建一个核心来存储数据(默认情况下,Solr将以schemaless模式创建)。

2. Spring Data

就像任何其他Spring Data项目一样,Spring Data Solr有一个明确的目标,即删除样板代码。

2.1 Maven依赖

让我们首先将Spring Data Solr依赖项添加到我们的pom.xml:

<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 定义Repository接口

接下来,我们需要通过扩展Spring Data Solr提供的Repository来创建Repository接口。我们自然会使用Product和String作为我们的实体ID对其进行参数化:

public interface ProductRepository extends SolrCrudRepository<Product, String> {

    List<Product> findByName(String name);

    @Query("id:*?0* OR name:*?0*")
    Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);

    @Query(name = "Product.findByNamedQuery")
    Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);
}

请注意我们如何在SolrCrudRepository提供的API之上定义三个方法。我们将在接下来的几节中讨论这些内容。

另请注意,Product.findByNamedQuery属性是在类路径文件夹中的Solr命名查询文件solr-named-queries.properties中定义的:

Product.findByNamedQuery=id:*?0* OR name:*?0*

2.4 Java配置

现在我们将探讨Solr持久层的Spring配置:

@Configuration
@EnableSolrRepositories(
      basePackages = "cn.tuyucheng.taketoday.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来扫描Repository的包。请注意,我们指定了命名查询属性文件的位置并启用了多核支持。

如果未启用多核,则默认情况下Spring Data将假定Solr配置是针对单核的。我们在这里启用多核,仅供参考。

3. 使用Spring Boot的Spring Data Solr

在本节中,我们将看看Spring Boot应用程序中的设置。

让我们首先将Spring Boot Starter Data Solr依赖项添加到我们的pom.xml中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
    <version>2.4.12</version>
</dependency>

你可以在此处找到最新版本的依赖项。

我们还必须使用Solr URL的值在application.properties文件中定义属性spring.data.solr.host

spring.data.solr.host=http://localhost:8983/solr

确保Solr正在指定的URL上运行。

这是我们在Spring Boot应用程序中设置Spring Data Solr所需的所有配置,因为将启动器依赖项放在类路径上将加载自动配置

4. 索引、更新和删除

为了在Solr中搜索文档,应该将文档索引到Solr Repository。

以下示例仅通过使用SolrCrudRepository的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 SolrAPI提供的不同查询技术。

5.1 方法名称查询生成

基于方法名称的查询是通过解析方法名称生成预期的查询来执行的:

public List<Product> findByName(String name);

在我们的Repository接口中,我们有findByName方法,它根据方法名称生成查询:

List<Product> retrievedProducts = productRepository.findByName("Phone");

5.2 使用@Query注解查询

可以通过在方法的@Query注解中包含查询来创建Solr搜索查询。在我们的示例中,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);

请注意,如果属性文件中查询的key(findByNamedQuery)与方法名称匹配,则不需要@Query注解。

让我们使用命名查询方法检索一些文档:

Page<Product> result = productRepository.findByNamedQuery("one", PageRequest.of(0, 10));

6. 总结

本文是对Spring Data Solr的快速实用介绍,涵盖了基本配置、定义Repository和自然查询。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章