Spring认证中国教育管理中心-Apache Solr 的 Spring 数据教程一

2022-01-06 15:05:21 浏览数 (1)

原标题:Spring认证中国教育管理中心-Apache Solr 的 Spring 数据教程一(Spring中国教育管理中心)

3.1.Spring 命名空间

Spring Data Solr 模块包含一个自定义命名空间,允许定义存储库 bean 并具有用于实例化SolrClient.

使用该repositories元素查找 Spring Data 存储库,如创建存储库实例中所述。

以下示例显示了如何设置使用 Spring Data Solr 命名空间的 Solr 存储库:

示例 52. 使用命名空间设置 Solr 存储库

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:solr="http://www.springframework.org/schema/data/solr"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/solr
    https://www.springframework.org/schema/data/solr/spring-solr.xsd">

  <solr:repositories base-package="com.acme.repositories" />
</beans>

使用 solr-serverorembedded-solr-server元素SolrClient在上下文中注册一个实例。

以下示例显示了如何为 HTTP 设置 Solr 客户端:

示例 53.HttpSolrClient使用命名空间

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:solr="http://www.springframework.org/schema/data/solr"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/solr
    https://www.springframework.org/schema/data/solr/spring-solr.xsd">

  <solr:solr-client id="solrClient" url="https://locahost:8983/solr" />
</beans>

以下示例显示了如何设置负载平衡 Solr 客户端:

示例 54.LBSolrClient使用命名空间

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:solr="http://www.springframework.org/schema/data/solr"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/solr
    https://www.springframework.org/schema/data/solr/spring-solr.xsd">

  <solr:solr-client id="solrClient" url="https://locahost:8983/solr,http://localhost:8984/solr" />
</beans>

以下示例显示了如何设置嵌入式 Solr 服务器:

示例 55. EmbeddedSolrServer 使用命名空间

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:solr="http://www.springframework.org/schema/data/solr"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/solr
    https://www.springframework.org/schema/data/solr/spring-solr.xsd">

  <solr:embedded-solr-server id="solrClient" solrHome="classpath:com/acme/solr" />
</beans>

3.2.基于注解的配置

Spring Data Solr 存储库支持可以通过 XML 命名空间和通过 Java 配置使用注释来激活。

以下示例显示了如何使用 Java 配置设置 Solr 存储库:

示例 56.使用 Java 配置的 Spring Data Solr 存储库

代码语言:javascript复制
@Configuration
@EnableSolrRepositories
class ApplicationConfig {

  @Bean
  public SolrClient solrClient() {
    EmbeddedSolrServerFactory factory = new EmbeddedSolrServerFactory("classpath:com/acme/solr");
    return factory.getSolrServer();
  }

  @Bean
  public SolrOperations solrTemplate() {
    return new SolrTemplate(solrClient());
  }
}

前面的配置设置了一个EmbeddedSolrServer,由SolrTemplate. Spring Data Solr 存储库通过使用@EnableSolrRepositories注解激活,注解本质上带有与 XML 命名空间相同的属性。如果没有配置基础包,则使用配置类所在的包。

3.3.使用 CDI 设置 Solr 存储库

您还可以使用 CDI 来设置 Spring Data Solr 存储库,如以下示例所示:

示例 57.使用 Java 配置的 Spring Data Solr 存储库

代码语言:javascript复制
class SolrTemplateProducer {

  @Produces
  @ApplicationScoped
  public SolrOperations createSolrTemplate() {
    return new SolrTemplate(new EmbeddedSolrServerFactory("classpath:com/acme/solr"));
  }
}

class ProductService {

  private ProductRepository repository;

  public Page<Product> findAvailableProductsByName(String name, Pageable pageable) {
    return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
  }

  @Inject
  public void setRepository(ProductRepository repository) {
    this.repository = repository;
  }
}

3.4.交易支持

Solr 对服务器级别事务的支持意味着自上次提交、优化或回滚以来的创建、更新和删除操作在服务器上排队,并作为一个组提交、优化或回滚。Spring Data Solr 存储库参与 Spring Managed Transactions 并在完成时提交或回滚更改。

以下示例显示了如何使用@Transactional注释来定义事务(在本例中为保存):

代码语言:javascript复制
@Transactional
public Product save(Product product) {
  Product savedProduct = jpaRepository.save(product);
  solrRepository.save(savedProduct);
  return savedProduct;
}

3.5.查询方法

本节介绍如何使用 Java 类中的方法创建查询。

3.5.1.查询查找策略

Solr 模块支持将查询手动定义为String或从方法名称派生。

目前没有 QueryDSL 支持。

声明的查询

从方法名称派生查询并不总是足够的,可能会导致方法名称不可读。在这种情况下,您可以使用 Solr 命名查询(参见“使用命名查询”)或使用@Query注释(参见“使用@Query注释”)。

3.5.2.查询创建

通常,Solr 的查询创建机制按照查询方法中的描述工作。下面的例子展示了什么是 Solr 查询方法:

示例 58. 根据方法名称创建查询

代码语言:javascript复制
public interface ProductRepository extends Repository<Product, String> {
  List<Product> findByNameAndPopularity(String name, Integer popularity);
}

前面的示例转换为以下 Solr 查询:

代码语言:javascript复制
q=name:?0 AND popularity:?1

下表描述了 Solr 支持的关键字:

集合类型可以与“Like”、“NotLike”、“StartingWith”、“EndingWith”和“Containing”一起使用。

Page<Product> findByNameLike(Collection<String> name);

3.5.3.使用@Query注解

使用命名查询(请参阅“使用命名查询”)来声明实体查询是一种有效的方法,并且适用于少量查询。由于查询本身与执行它们的 Java 方法相关联,因此您实际上可以使用 Spring Data Solr@Query批注直接绑定它们。下面的例子使用@Query注解来声明一个查询:

示例 59. 使用@Query注释在方法中声明查询。

代码语言:javascript复制
public interface ProductRepository extends SolrRepository<Product, String> {
  @Query("inStock:?0")
  List<Product> findByAvailable(Boolean available);
}

3.5.4.使用命名查询

命名查询可以保存在属性文件中并连接到相应的方法。您应该记住“查询查找策略”中描述的命名约定或使用@Query. 以下示例显示如何在属性文件中声明名称查询:

示例 60. 在属性文件中声明命名查询

代码语言:javascript复制
Product.findByNamedQuery=popularity:?0
Product.findByName=name:?0

下面的示例使用findByName前面示例中声明的命名查询 ( ) 之一:

代码语言:javascript复制
public interface ProductRepository extends SolrCrudRepository<Product, String> {

  List<Product> findByNamedQuery(Integer popularity);

  @Query(name = "Product.findByName")
  List<Product> findByAnnotatedNamedQuery(String name);

}

3.6.文件映射

尽管 SolrJ 中已经支持实体映射,但 Spring Data Solr 附带了自己的映射机制(在下一节中描述)。

DocumentObjectBinder具有优越的性能。因此,如果您不需要客户映射,我们建议您使用它。您可以DocumentObjectBinder通过SolrJConverter在 内注册来切换到SolrTemplate。

0 人点赞