Spring Data Elasticsearchの紹介
1. 概要
この記事では、we’ll explore the basics of Spring Data Elasticsearchをコードに焦点を合わせた実用的な方法で説明します。
Spring Dataを使用してSpringアプリケーションでElasticsearchのインデックス作成、検索、クエリを行う方法を示します。これは、人気のあるオープンソースのLuceneベースの検索エンジンとやり取りするためのSpringモジュールです。
Elasticsearchはスキーマレスですが、フィールドのタイプを伝えるためにマッピングを使用できます。 文書が索引付けされると、そのフィールドはタイプに従って処理されます。 たとえば、テキストフィールドはトークン化され、マッピングルールに従ってフィルタリングされます。 独自のフィルターとトークナイザーを作成することもできます。
2. 春のデータ
Spring Dataは、定型コードの回避に役立ちます。 たとえば、Spring Data Elasticsearch,によって提供されるElasticsearchRepositoryインターフェイスを拡張するリポジトリインターフェイスを定義すると、対応するドキュメントクラスのCRUD操作がデフォルトで使用可能になります。
さらに、所定の形式の名前でメソッドを宣言するだけで、メソッドの実装が自動的に生成されます。リポジトリインターフェイスの実装を記述する必要はありません。
Spring Datahereの詳細を読むことができます。
2.1. メーベン依存
Spring Data Elasticsearchは、検索エンジン用のJava APIを提供します。 これを使用するには、pom.xmlに新しい依存関係を追加する必要があります。
org.springframework.data
spring-data-elasticsearch
3.0.8.RELEASE
2.2. リポジトリインターフェースの定義
次に、提供されているリポジトリインターフェイスの1つを拡張して、ジェネリック型を実際のドキュメントとプライマリキーの型に置き換えます。
ElasticsearchRepositoryはPagingAndSortingRepositoryを拡張し、ページ付けと並べ替えの組み込みサポートを提供することに注意してください。
この例では、カスタム検索メソッドでページング機能を使用します。
public interface ArticleRepository extends ElasticsearchRepository {
Page findByAuthorsName(String name, Pageable pageable);
@Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}")
Page findByAuthorsNameUsingCustomQuery(String name, Pageable pageable);
}
2つのカスタムメソッドを追加したことに注意してください。 findByAuthorsNameメソッドを使用すると、リポジトリプロキシはメソッド名に基づいて実装を作成します。 解決アルゴリズムは、authorsプロパティにアクセスする必要があると判断し、各アイテムのnameプロパティを検索します。
2番目のメソッドfindByAuthorsNameUsingCustomQueryは、@Queryアノテーションを使用して定義されたElasticsearchブールクエリを使用します。これには、作成者の名前と指定されたname引数の厳密な一致が必要です。
2.3. Java設定
ここで、永続層のSpring構成について見ていきましょう。
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.spring.data.es.repository")
@ComponentScan(basePackages = { "com.example.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イネーブルスタイルアノテーション(@EnableElasticsearchRepositories)を使用して、提供されたパッケージでSpringデータリポジトリをスキャンしていることに注意してください。
単純なTransport Clientも定義しています。
-
「client.transport.sniff」を使用して、クライアントのスニッフィング機能を有効にします
-
また、「path.home」を使用してElasticsearchインストールディレクトリを提供します
-
クラスター名が「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 authors;
// standard getters and setters
}
@Documentアノテーションでは、このクラスのインスタンスをElasticsearchの「blog」というインデックスに「article」のドキュメントタイプで保存する必要があることを示しています。 typesが多数異なるドキュメントは、同じindexに保存できます。
また、authorsフィールドがFieldType.Nestedとしてマークされていることにも注意してください。 これにより、Authorクラスを個別に定義できますが、Elasticsearchでインデックスが作成されると、作成者の個々のインスタンスがArticleドキュメントに埋め込まれます。
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 articleByAuthorName
= articleService.findByAuthorName(nameToFind, PageRequest.of(0, 10));
PageRequestオブジェクトを使用してfindByAuthorNameを呼び出すと、結果の最初のページ(ページ番号はゼロベース)が取得され、そのページには最大10個の記事が含まれます。
5.2. カスタムクエリ
Spring Data Elasticsearchリポジトリのカスタムクエリを定義する方法はいくつかあります。 1つの方法は、セクション2.2に示すように、@Queryアノテーションを使用することです。
別のオプションは、カスタムクエリ作成にビルダーを使用することです。
たとえば、NativeSearchQueryBuilderを使用してクエリを作成することにより、タイトルに「data」という単語が含まれる記事を検索できます。
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withFilter(regexpQuery("title", ".*data.*"))
.build();
List articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
6. 更新と削除
ドキュメントを更新または削除するには、まずそのドキュメントを取得する必要があります。
String articleTitle = "Spring Data Elasticsearch";
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%"))
.build();
List articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
ここで、記事のタイトルを更新するために–ドキュメントを変更し、saveAPIを使用できます。
article.setTitle("Getting started with Search Engines");
articleService.save(article);
ご想像のとおり、ドキュメントを削除するには、deleteメソッドを使用できます。
articleService.delete(articles.get(0));
7. 結論
これは、Spring Data Elasticsearchの基本的な使用法についての迅速かつ実践的な議論でした。
Elasticsearchの印象的な機能の詳細については、公式Webサイトでそのdocumentationを見つけることができます。
この記事で使用されている例は、sample project in GitHubとして利用できます。