1. 概要

このチュートリアルでは、コードに焦点を当てた実用的な方法でSpring DataElasticsearchの基本を探ります。

Spring Data Elasticsearchを使用して、SpringアプリケーションでElasticsearchのインデックス作成、検索、クエリを行う方法を示します。 Spring Data Elasticseachは、Spring Dataを実装するSpringモジュールであり、人気のあるオープンソースのLuceneベースの検索エンジンと対話する方法を提供します。

Elasticsearchはほとんど定義されていないスキーマでも機能しますが、スキーマを設計し、特定のフィールドで期待されるデータのタイプを指定するマッピングを作成するのが一般的な方法です。 ドキュメントにインデックスが付けられると、そのフィールドはタイプに従って処理されます。 たとえば、テキストフィールドはトークン化され、マッピングルールに従ってフィルタリングされます。 独自のフィルターとトークナイザーを作成することもできます。

簡単にするために、ElasticsearchインスタンスにはDockerイメージを使用しますが、ポート9200でリッスンしているElasticsearchインスタンスはを使用します。

まず、Elasticsearchインスタンスを起動します。

docker run -d --name es762 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.2

2. 春のデータ

Spring Dataは、ボイラープレートコードを回避するのに役立ちます。 たとえば、Spring DataElasticsearchによって提供されるElasticsearchRepositoryインターフェイスを拡張するリポジトリインターフェイスを定義すると、対応するドキュメントクラスのCRUD操作がデフォルトで使用可能になります。

さらに、事前定義された形式で名前を使用してメソッドを宣言するだけで、メソッドの実装が生成されます。リポジトリインターフェイスの実装を作成する必要はありません。

Spring Data のBaeldungガイドは、このトピックを開始するための基本事項を提供します。

2.1. Mavenの依存関係

Spring Data Elasticsearchは、検索エンジン用のJavaAPIを提供します。 これを使用するには、pom.xmlに新しい依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>4.0.0.RELEASE</version>
</dependency>

2.2. リポジトリインターフェースの定義

新しいリポジトリを定義するために、提供されているリポジトリインターフェイスの1つを拡張し、汎用タイプを実際のドキュメントと主キータイプに置き換えます。

注意することが重要です ElasticsearchRepository から拡張 PagingAndSortingRepository。 これにより、ページ付けと並べ替えのサポートが組み込まれます。

この例では、カスタム検索メソッドでページング機能を使用します。

public interface ArticleRepository extends ElasticsearchRepository<Article, String> {

    Page<Article> findByAuthorsName(String name, Pageable pageable);

    @Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}")
    Page<Article> findByAuthorsNameUsingCustomQuery(String name, Pageable pageable);
}

findByAuthorsName メソッドを使用すると、リポジトリプロキシはメソッド名に基づいて実装を作成します。 解決アルゴリズムは、 authors プロパティにアクセスする必要があると判断し、各アイテムのnameプロパティを検索します。

2番目のメソッドfindByAuthorsNameUsingCustomQueryは、 @Query アノテーションを使用して定義されたカスタムElasticsearchブールクエリを使用します。これには、作成者の名前と提供されたnameの厳密な一致が必要です。口論。

2.3. Java構成

JavaアプリケーションでElasticsearchを設定するときは、Elasticsearchインスタンスへの接続方法を定義する必要があります。 そのために、Elasticsearchの依存関係によって提供されるRestHighLevelClientを使用します。

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository")
@ComponentScan(basePackages = { "com.baeldung.spring.data.es.service" })
public class Config {

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration 
            = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }
}

標準のSpring対応のスタイル注釈を使用しています。 @EnableElasticsearchRepositories は、SpringDataElasticsearchに提供されたSpringDataリポジトリのパッケージをスキャンさせます。

Elasticsearchサーバーと通信するために、単純な RestHighLevelClient を使用します。Elasticsearchは複数のタイプのクライアントを提供しますが、RestHighLevelClientを使用することは将来への良い方法です-サーバーとの通信を保証します。

最後に、 ElasticsearchOperations Beanをセットアップして、サーバー上で操作を実行します。 この場合、ElasticsearchRestTemplateをインスタンス化します。

3. マッピング

マッピングは、ドキュメントのスキーマを定義するために使用されます。 ドキュメントにスキーマを定義することで、不要なタイプへのマッピングなど、望ましくない結果からドキュメントを保護します。

私たちのエンティティは、 Article という名前の単純なドキュメントであり、idのタイプはStringです。 また、このようなドキュメントは、articleタイプ内のblogという名前のインデックスに保存する必要があることも指定しています。

@Document(indexName = "blog", type = "article")
public class Article {

    @Id
    private String id;
    
    private String title;
    
    @Field(type = FieldType.Nested, includeInParent = true)
    private List<Author> authors;
    
    // standard getters and setters
}

インデックスにはいくつかのタイプがあります。 この機能を使用して、階層を実装できます。

authorsフィールドはFieldType.Nestedとしてマークされています。 これにより、 Author クラスを個別に定義できますが、Elasticsearchでインデックスを作成するときに、作成者の個々のインスタンスをArticleドキュメントに埋め込むことができます。

4. ドキュメントのインデックス作成

Spring Data Elasticsearchは通常、プロジェクト内のエンティティに基づいてインデックスを自動作成します。 ただし、クライアントテンプレートを介してプログラムでインデックスを作成することもできます。

elasticsearchTemplate.indexOps(Article.class).create();

次に、ドキュメントをインデックスに追加できます。

Article article = new Article("Spring Data Elasticsearch");
article.setAuthors(asList(new Author("John Smith"), new Author("John Doe")));
articleRepository.save(article);

5. クエリ

5.1. メソッド名ベースのクエリ

メソッド名ベースのクエリを使用する場合、実行するクエリを定義するメソッドを記述します。 セットアップ中に、Spring Dataはメソッドシグネチャを解析し、それに応じてクエリを作成します。

String nameToFind = "John Smith";
Page<Article> articleByAuthorName
  = articleRepository.findByAuthorsName(nameToFind, PageRequest.of(0, 10));

PageRequestオブジェクトを指定してfindByAuthorsNameを呼び出すと、結果の最初のページ(ページ番号はゼロベース)が取得され、そのページには最大10個の記事が含まれます。 ページオブジェクトは、クエリのヒットの総数とその他の便利なページネーション情報も提供します。

5.2. カスタムクエリ

SpringDataElasticsearchリポジトリのカスタムクエリを定義する方法はいくつかあります。 1つの方法は、セクション2.2で示すように、@Queryアノテーションを使用することです。

もう1つのオプションは、クエリビルダーを使用してカスタムクエリを作成することです。

タイトルに「data」という単語が含まれる記事を検索する必要があるため、 title:にフィルターを使用してNativeSearchQueryBuilderを作成できます。

Query searchQuery = new NativeSearchQueryBuilder()
   .withFilter(regexpQuery("title", ".*data.*"))
   .build();
SearchHits<Article> articles = 
   elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog");

6. 更新と削除

ドキュメントを更新するには、最初にドキュメントを取得する必要があります。

String articleTitle = "Spring Data Elasticsearch";
Query searchQuery = new NativeSearchQueryBuilder()
  .withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%"))
  .build();

SearchHits<Article> articles = 
   elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog");
Article article = articles.getSearchHit(0).getContent();

次に、評価者を使用してオブジェクトのコンテンツを編集するだけで、ドキュメントに変更を加えることができます。

article.setTitle("Getting started with Search Engines");
articleRepository.save(article);

削除に関しては、いくつかのオプションがあります。 delete メソッドを使用して、ドキュメントを取得して削除できます。

articleRepository.delete(article);

わかっている場合は、idで削除することもできます。

articleRepository.deleteById("article_id");

カスタムdeleteByクエリを作成し、Elasticsearchが提供する一括削除機能を利用することもできます。

articleRepository.deleteByTitle("title");

7. 結論

このチュートリアルでは、SpringDataElasticsearchを接続して利用する方法について説明しました。 ドキュメントのクエリ、更新、削除の方法について説明しました。 さらに、カスタムクエリを作成する方法についても説明しましたが、それらはSpring DataElasticsearchが提供するものに適合しません。

いつものように、このチュートリアル全体で使用されるソースコードは、GitHubにあります。