響應式 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)
}
1 | 該方法展示了查詢所有給定 lastname 的人的方法。 |
2 | 等待來自 Publisher 的輸入以繫結 firstname 引數值的查詢方法。 |
3 | 根據 lastname 對匹配文件進行排序的查詢方法。 |
4 | 根據透過 Sort 引數定義的表示式對匹配文件進行排序的查詢方法。 |
5 | 使用 Pageable 向資料庫傳遞偏移量和排序引數。 |
6 | 使用 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 操作以及對實體進行排序訪問的方法都可用。使用倉庫例項只需將其依賴注入到客戶端中,如下例所示
示例 4. 對 Person 實體的排序訪問
public class PersonRepositoryTests {
@Autowired ReactivePersonRepository repository;
@Test
public void sortsElementsCorrectly() {
Flux<Person> persons = repository.findAll(Sort.by(new Order(ASC, "lastname")));
// ...
}
}