Reactive Elasticsearch Repositories

Reactive Elasticsearch存储库支持基于由Reactive REST Client执行的、通过Reactive Elasticsearch Operations提供的操作的Repositories中解释的核心存储库支持的基础上构建。 Spring Data Elasticsearch 反应式存储库支持使用 Project Reactor 作为其首选反应式组合库。 有 3 个主要要使用的接口:

  • ReactiveRepository

  • ReactiveCrudRepository

  • ReactiveSortingRepository

Usage

要使用 Repository 访问存储在 Elasticsearch 中的域对象,只需创建一个接口即可。在继续操作之前,需要一个实体。

Example 1. Sample Person entity
public class Person {

  @Id
  private String id;
  private String firstname;
  private String lastname;
  private Address address;

  // … getters and setters omitted
}

请注意,id 属性的类型需要是 String

Example 2. Basic repository interface to persist Person entities
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 Finder 方法等待从 Publisher 输入以绑定 firstname 的参数值。
3 Finder 方法按 lastname 顺序排列匹配的文档。
4 Finder 方法按通过 Sort 参数定义的表达式顺序排列匹配的文档。
5 使用 Pageable 将偏移量和排序参数传递给数据库。
6 Finder 方法使用 And / Or 关键词连接条件。
7 查找第一个匹配的实体。
8 该方法显示查询所有具有给定 lastname 的人员,其通过使用指定的 @Query 和给定的参数查找进行查询。
9 计算所有具有匹配 firstname 的实体的数量。
10 检查是否有至少一个具有匹配 firstname 的实体存在。
11 删除所有具有匹配 firstname 的实体。

Configuration

对于 Java 配置,请使用 @EnableReactiveElasticsearchRepositories 注释。如果未配置基本包,该基础会扫描注释的配置类的包。

以下清单展示如何针对仓库使用 Java 配置:

Example 3. Java configuration for repositories
@Configuration
@EnableReactiveElasticsearchRepositories
public class Config extends AbstractReactiveElasticsearchConfiguration {

  @Override
  public ReactiveElasticsearchClient reactiveElasticsearchClient() {
    return ReactiveRestClients.create(ClientConfiguration.localhost());
  }
}

因为来自上一个示例的存储库扩展了 ReactiveSortingRepository,所以除了对实体的分类访问方法外,所有 CRUD 操作都是可用的。使用存储库实例是一个将依赖注入到客户端的问题,如下示例所示:

Example 4. Sorted access to Person entities
public class PersonRepositoryTests {

  @Autowired ReactivePersonRepository repository;

  @Test
  public void sortsElementsCorrectly() {

    Flux<Person> persons = repository.findAll(Sort.by(new Order(ASC, "lastname")));

    // ...
  }
}