リアクティブ Elasticsearch リポジトリ

リアクティブ Elasticsearch リポジトリサポートは、リアクティブ REST クライアントによって実行されるリアクティブ型 Elasticsearch オペレーションを介して提供される操作を利用して、リポジトリで説明されているコアリポジトリサポートに基づいて構築されます。

Spring Data Elasticsearch リアクティブリポジトリサポートでは、選択されたリアクティブコンポジションライブラリとしてプロジェクト 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 を持つすべての人々に対するクエリを示します。
2Finder メソッドは、firstname のパラメーター値をバインドするために Publisher からの入力を待機しています。
3lastname によって一致するドキュメントを順序付けする Finder メソッド。
4Sort パラメーターで定義された式によって一致するドキュメントを順序付けする Finder メソッド。
5Pageable を使用して、オフセットと並べ替えのパラメーターをデータベースに渡します。
6And / Or キーワードを使用して条件を連結するファインダーメソッド。
7 最初に一致するエンティティを見つけます。
8 このメソッドは、指定されたパラメーターを使用してアノテーション付き @Query を実行することによって検索された、指定された lastname を持つすべての人々に対するクエリを示します。
9firstname と一致するすべてのエンティティをカウントします。
10 一致する firstname を持つエンティティが少なくとも 1 つ存在するかどうかを確認します。
11firstname と一致するすべてのエンティティを削除します。

構成

Java 構成の場合は、@EnableReactiveElasticsearchRepositories アノテーションを使用します。基本パッケージが構成されていない場合、インフラストラクチャーは、アノテーションが付けられた構成クラスのパッケージをスキャンします。

次のリストは、リポジトリの Java 構成を使用する方法を示しています。

例 3: リポジトリの Java 構成
@Configuration
@EnableReactiveElasticsearchRepositories
public class Config extends AbstractReactiveElasticsearchConfiguration {

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

前の例のリポジトリは ReactiveSortingRepository を継承しているため、エンティティへの並べ替えられたアクセスのメソッドだけでなく、すべての CRUD 操作も利用できます。次の例に示すように、リポジトリインスタンスの操作は、それをクライアントに注入する依存関係の問題です。

例 4: 人物エンティティへのソートされたアクセス
public class PersonRepositoryTests {

  @Autowired ReactivePersonRepository repository;

  @Test
  public void sortsElementsCorrectly() {

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

    // ...
  }
}