响应式 Elasticsearch 仓库
响应式 Elasticsearch 仓库支持构建在仓库一章中介绍的核心仓库支持之上,利用通过响应式 Elasticsearch 操作提供、由响应式 REST 客户端执行的操作。
Spring Data Elasticsearch 响应式仓库支持选用 Project Reactor 作为其响应式组合库。
有 3 个主要接口可供使用:
-
ReactiveRepository -
ReactiveCrudRepository -
ReactiveSortingRepository
用法
要使用 Repository 访问存储在 Elasticsearch 中的领域对象,只需为其创建一个接口。在真正动手之前,您需要先有一个实体。
示例 1. 样例 Person 实体
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
private Address address;
// … getters and setters omitted
}
请注意,id 属性的类型必须为 String。
示例 2. 用于持久化 Person 实体的基本仓库接口
interface ReactivePersonRepository extends ReactiveSortingRepository<Person, String> {
Flux<Person> findByFirstname(String firstname); // <1>
Flux<Person> findByFirstname(Publisher<String> firstname); // <2>
Flux<Person> findByFirstnameOrderByLastname(String firstname); // <3>
Flux<Person> findByFirstname(String firstname, Sort sort); // <4>
Flux<Person> findByFirstname(String firstname, Pageable page); // <5>
Mono<Person> findByFirstnameAndLastname(String firstname, String lastname); // <6>
Mono<Person> findFirstByLastname(String lastname); // <7>
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"lastname\" : \"?0\" } } } }")
Flux<Person> findByLastname(String lastname); // <8>
Mono<Long> countByFirstname(String firstname) // <9>
Mono<Boolean> existsByFirstname(String firstname) // <10>
Mono<Long> deleteByFirstname(String firstname) // <11>
}
该方法展示了一个查询,用于查找所有具有给定
lastname的人员。查找方法等待来自
Publisher的输入,以为firstname绑定参数值。查找方法按照
lastname对匹配的文档进行排序。查找方法按照通过
Sort参数定义的表达式对匹配的文档进行排序。使用
Pageable将偏移量和排序参数传递给数据库。查找方法使用
And/Or关键词拼接条件。查找第一个匹配的实体。
该方法展示了一个查询:运行带有给定参数的注解
@Query,以查找所有具有给定lastname的人员。统计所有与
firstname匹配的实体数量。检查是否至少存在一个与
firstname匹配的实体。删除所有与
firstname匹配的实体。
配置
对于 Java 配置,请使用 @EnableReactiveElasticsearchRepositories 注解。如果未配置基础包,基础设施会扫描带注解的配置类所在的包。
以下清单展示了如何为仓库使用 Java 配置:
示例 3. 仓库的 Java 配置
@Configuration
@EnableReactiveElasticsearchRepositories
public class Config extends AbstractReactiveElasticsearchConfiguration {
@Override
public ReactiveElasticsearchClient reactiveElasticsearchClient() {
return ReactiveRestClients.create(ClientConfiguration.localhost());
}
}
因为上一个示例中的仓库继承了 ReactiveSortingRepository,所以所有 CRUD 操作以及用于有序访问实体的方法都可用。如以下示例所示,使用仓库实例只需将其依赖注入到客户端中:
示例 4. 对 Person 实体的有序访问
public class PersonRepositoryTests {
@Autowired ReactivePersonRepository repository;
@Test
public void sortsElementsCorrectly() {
Flux<Person> persons = repository.findAll(Sort.by(new Order(ASC, "lastname")));
// ...
}
}