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

Apache Solr 的 Spring 数据教程一
3.1.Spring 命名空间
Spring Data Solr 模块蕴含一个自定义命名空间,容许定义存储库 bean 并具备用于实例化SolrClient.

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

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

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

<?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.xsdhttp://www.springframework.org/schema/data/solrhttps://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应用命名空间

<?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.xsdhttp://www.springframework.org/schema/data/solrhttps://www.springframework.org/schema/data/solr/spring-solr.xsd">

<solr:solr-client id="solrClient" url="https://locahost:8983/solr" />
</beans>
以下示例显示了如何设置负载平衡 Solr 客户端:

示例 54.LBSolrClient应用命名空间

<?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.xsdhttp://www.springframework.org/schema/data/solrhttps://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 应用命名空间

<?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.xsdhttp://www.springframework.org/schema/data/solrhttps://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 存储库

@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 存储库

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正文来定义事务(在本例中为保留):

@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. 依据办法名称创立查问

public interface ProductRepository extends Repository<Product, String> {
List<Product> findByNameAndPopularity(String name, Integer popularity);
}
后面的示例转换为以下 Solr 查问:

q=name:?0 AND popularity:?1
下表形容了 Solr 反对的关键字:

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正文在办法中申明查问。

public interface ProductRepository extends SolrRepository<Product, String> {
@Query("inStock:?0")
List<Product> findByAvailable(Boolean available);
}
3.5.4.应用命名查问
命名查问能够保留在属性文件中并连贯到相应的办法。您应该记住“查问查找策略”中形容的命名约定或应用@Query. 以下示例显示如何在属性文件中申明名称查问:

示例 60. 在属性文件中申明命名查问

Product.findByNamedQuery=popularity:?0
Product.findByName=name:?0
上面的示例应用findByName后面示例中申明的命名查问 ( ) 之一:

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。