响应式 Elasticsearch 仓库

响应式 Elasticsearch 仓库支持建立在仓库中解释的核心仓库支持的基础上,利用通过响应式 Elasticsearch 操作提供的操作,由响应式 REST 客户端执行。

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 此方法显示了对所有具有给定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")));

    // ...
  }
}