原标题: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。