前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring认证中国教育管理中心-Apache Solr 的 Spring 数据教程一

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

原创
作者头像
IT胶囊
发布2022-01-06 15:05:21
6060
发布2022-01-06 15:05:21
举报
文章被收录于专栏:IT技能应用IT技能应用

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

Apache Solr 的 Spring 数据教程一
Apache Solr 的 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 支持的关键字:

Apache Solr 的 Spring 数据教程一
Apache Solr 的 Spring 数据教程一
Apache Solr 的 Spring 数据教程一
Apache Solr 的 Spring 数据教程一

集合类型可以与“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。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.1.Spring 命名空间
  • 3.2.基于注解的配置
  • 3.3.使用 CDI 设置 Solr 存储库
  • 3.4.交易支持
  • 3.5.查询方法
  • 3.5.1.查询查找策略
  • 声明的查询
  • 3.5.2.查询创建
  • 3.5.3.使用@Query注解
  • 3.5.4.使用命名查询
  • 3.6.文件映射
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档