反應式 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 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 的實體。

組態

對於 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")));

    // ...
  }
}