|
此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Data Elasticsearch 6.0.4! |
响应式 Elasticsearch 仓库
响应式 Elasticsearch 仓库支持建立在 仓库 中解释的核心仓库支持之上,利用通过 响应式 Elasticsearch 操作 提供的操作,并由 响应式 REST 客户端 执行。
Spring Data Elasticsearch 的响应式仓库支持使用 Project Reactor 作为其首选的响应式组合库。
主要有 3 个接口可供使用:
-
ReactiveRepository -
ReactiveCrudRepository -
ReactiveSortingRepository
用法
要访问存储在 Elasticsearch 中的领域对象,只需使用 Repository 为其创建一个接口。
在执行此操作之前,您需要先拥有一个实体。
示例 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 实体的基本 Repository 接口
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)
}
| 1 | 该方法展示了针对所有具有给定lastname的人员的查询。 |
| 2 | 查找方法正在等待从 Publisher 输入以绑定参数 firstname 的值。 |
| 3 | 查找方法按lastname对匹配文档进行排序。 |
| 4 | 查找方法通过 Sort 参数定义的表达式对匹配文档进行排序。 |
| 5 | 使用 Pageable 将偏移量和排序参数传递给数据库。 |
| 6 | 查找方法使用 And / Or 关键字连接条件。 |
| 7 | 查找第一个匹配的实体。 |
| 8 | 该方法展示了一个查询,用于查找所有具有给定 lastname 的人员,通过运行带有给定参数的已注解 @Query 来实现。 |
| 9 | 统计所有匹配 firstname 的实体。 |
| 10 | 检查是否存在至少一个匹配 firstname 的实体。 |
| 11 | 删除所有匹配 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")));
// ...
}
}