Spring Data Elasticsearchの紹介

データ]

  • リンク:/tag/elasticsearch/[Elasticsearch]

1概要

この記事では、Spring Data Elasticsearchの基本について、コードに焦点を絞った実用的な方法で説明します。

Springデータを使用して、SpringアプリケーションでElasticsearchのインデックス付け、検索、クエリを実行する方法を説明します。これは、人気のあるオープンソースのLuceneベースの検索エンジンと対話するためのSpringモジュールです。

Elasticsearchはスキーマレスですが、フィールドの種類を知らせるためにマッピングを使用できます。文書が索引付けされると、そのフィールドはそのタイプに従って処理されます。たとえば、テキストフィールドはマッピングルールに従ってトークン化され、フィルタ処理されます。あなた自身のフィルタやトークナイザーを作成することもできます。

2春のデータ

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

さらに、規定のフォーマットの名前でメソッドを宣言するだけで、メソッド実装が自動的に生成されます。リポジトリインタフェースの実装を記述する必要はありません。

Spring Dataのリンクについてもっと読むことができます。

** 2.1. メーベン依存

**

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

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.0.8.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);
}

2つのカスタムメソッドが追加されたことに注意してください。 findByAuthorsName メソッドを使用すると、リポジトリプロキシはメソッド名に基づいて実装を作成します。解決アルゴリズムは、 authors プロパティにアクセスしてから各アイテムの name プロパティを検索する必要があると判断します。

2番目のメソッド findByAuthorsNameUsingCustomQuery は、 @ Query アノテーションを使用して定義されたElasticsearchブールクエリを使用します。これには、作成者の名前と指定された name 引数を厳密に一致させる必要があります。

2.3. Javaの設定

それでは、ここでSpringの永続化レイヤの設定を調べてみましょう。

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

    @Value("${elasticsearch.home:/usr/local/Cellar/elasticsearch/5.6.0}")
    private String elasticsearchHome;

    @Value("${elasticsearch.cluster.name:elasticsearch}")
    private String clusterName;

    @Bean
    public Client client() {
        Settings elasticsearchSettings = Settings.builder()
          .put("client.transport.sniff", true)
          .put("path.home", elasticsearchHome)
          .put("cluster.name", clusterName).build();
        TransportClient client = new PreBuiltTransportClient(elasticsearchSettings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        return client;
    }

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

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

また、簡単なhttps://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html[トランスポートクライアント]も定義します。

  1. 私達は私達の顧客のためにスニッフィング機能を有効にします

“ client.transport.sniff” 。 「path.home」を使用してElasticsearchのインストールディレクトリも提供

  1. クラスタ名が "elasticsearch"ではない場合、それを使ってそれを提供する必要があります.

“ cluster.name”

最後に、Elasticsearchサーバーに対して機能するクライアントとして、 ElasticsearchOperations Bean( elasticsearchTemplate )も設定します。

3マッピング

最初のエンティティ、つまり文字列 id を持つ Article というドキュメントを定義しましょう。

@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
}

@ Document アノテーションでは、このクラスのインスタンスはElasticsearchの " blog "というインデックスに、ドキュメントタイプ " article "で格納する必要があることを示しています。さまざまな __type を持つ文書を同じ index__に格納できます。

authors フィールドが FieldType.Nested としてマークされていることにも注意してください。

これにより、 Author クラスを個別に定義できますが、Elasticsearchでインデックスが作成されている場合は、 Article ドキュメントに個々のauthorインスタンスを埋め込むことができます。

** 4文書の索引付け

**

Spring Data Elasticsearchは通常、プロジェクト内のエンティティに基づいてインデックスを自動作成します。

ただし、クライアントテンプレートを使用してプログラムでインデックスを作成することもできます。

elasticsearchTemplate.createIndex(Article.class);

インデックスが利用可能になったら、ドキュメントをインデックスに追加できます。

例を簡単に見てみましょう。2人の著者がいる記事に索引を付けます。

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

5問い合わせ中

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

先に定義したリポジトリクラスは findByAuthorsName メソッドを持っていました - 著者名で記事を見つけるために使うことができます:

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

PageRequest オブジェクトを使用して findByAuthorName を呼び出すと、結果の最初のページが取得されます(ページ番号は0から始まります)。そのページには最大10件の記事が含まれます。

5.2. カスタムクエリ

Spring Data Elasticsearchリポジトリのカスタムクエリを定義する方法はいくつかあります。 1つの方法は、セクション2.2で示されているように、 @ Query 注釈を使用することです。

もう1つの選択肢は、カスタムクエリー作成にビルダーを使用することです。

たとえば、 NativeSearchQueryBuilder を使用してクエリを作成することで、タイトルに「 data 」という単語が含まれている記事を検索できます。

SearchQuery searchQuery = new NativeSearchQueryBuilder()
  .withFilter(regexpQuery("title", ".** data.** "))
  .build();
List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);

** 6. 更新と削除

**

ドキュメントを更新または削除するには、まずそのドキュメントを取得する必要があります。

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

List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);

それでは、記事のタイトルを更新するために - ドキュメントを修正し、 save APIを使用することができます。

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

ご想像のとおり、文書を削除するには delete メソッドを使います。

articleService.delete(articles.get(0));

7. 結論

これは、Spring Data Elasticsearchの基本的な使用法についての迅速で実用的な議論でした。

Elasticsearchの優れた機能の詳細については、公式Webサイトでhttps://www.elastic.co/guide/en/elasticsearch/reference/current/index.html[documentation]を参照してください。

この記事で使用されている例は、https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-elasticsearch[GitHubのサンプルプロジェクト]として入手できます。