Spring Data访问Elasticsearch----响应式Reactive存储库
Reactive Elasticsearch存储库支持建立在存储库中解释的核心存储库支持之上,利用由 Reactive REST客户端执行的 Reactive Elasticsearch Operations提供的操作。
Spring Data Elasticsearch响应式存储库支持使用Project Reactor作为其选择的响应式组合库。
有三个主要接口可供使用:
- 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
}
1. 该方法显示具有给定firstname的所有人的查询。
2. Finder方法正在等待Publisher的输入以绑定firstname的参数值。
3. Finder方法按lastname排序匹配的文档。
4. Finder方法通过Sort参数定义的表达式对匹配的文档进行排序。
5. 使用Pageable将偏移量和排序参数传递到数据库。
6. Finder方法使用And/Or关键字连接条件。
7. 查找第一个匹配的实体。
8. 该方法显示了通过使用给定参数运行@Query注解来查找的具有给定lastname的所有人的查询。
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操作以及对实体进行排序访问的方法都是可用的。使用存储库实例是一个将依赖项注入client的问题,如下面的示例所示:
例4:对Person实体的排序访问
public class PersonRepositoryTests {
@Autowired ReactivePersonRepository repository;
@Test
public void sortsElementsCorrectly() {
Flux<Person> persons = repository.findAll(Sort.by(new Order(ASC, "lastname")));
// ...
}
}