最新の安定バージョンについては、Spring Data Elasticsearch 6.0.1 を使用してください! |
Elasticsearch リポジトリ
この章では、Elasticsearch リポジトリの実装の詳細について説明します。
Book エンティティ @Document(indexName="books")
class Book {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Text)
private String summary;
@Field(type = FieldType.Integer)
private Integer price;
// getter/setter ...
}対応するマッピングを使用したインデックスの自動作成
@Document アノテーションには引数 createIndex があります。この引数が true (デフォルト値) に設定されている場合、Spring Data または Elasticsearch は、アプリケーションの起動時にリポジトリサポートをブートストラップするときに、@Document アノテーションで定義されたインデックスが存在するかどうかを確認します。
存在しない場合は、インデックスが作成され、エンティティのアノテーションから派生したマッピング ( Elasticsearch オブジェクトマッピングを参照) が新しく作成されたインデックスに書き込まれます。作成されるインデックスの詳細は、@Setting アノテーションを使用して設定できます。詳細については、インデックス設定を参照してください。
リポジトリメソッドのアノテーション
@Highlight
リポジトリメソッドの @Highlight アノテーションは、返されたエンティティの強調表示を含めるフィールドを定義します。Book の名前または概要内のテキストを検索し、見つかったデータを強調表示するには、次のリポジトリメソッドを使用できます。
interface BookRepository extends Repository<Book, String> {
@Highlight(fields = {
@HighlightField(name = "name"),
@HighlightField(name = "summary")
})
SearchHits<Book> findByNameOrSummary(String text, String summary);
} 上記のように複数のフィールドを強調表示するように定義することができ、@Highlight アノテーションと @HighlightField アノテーションの両方を @HighlightParameters アノテーションでさらにカスタマイズできます。可能な構成オプションについては Javadoc を確認してください。
検索結果では、SearchHit クラスからハイライトデータを取得できます。
@SourceFilters
場合によっては、検索から返されるエンティティのすべてのプロパティではなく、サブセットのみが必要なことがあります。Elasticsearch は、ネットワーク経由でアプリケーションに転送されるデータの量を削減するソースフィルタリングを提供します。
Query 実装および ElasticsearchOperations を使用する場合、クエリにソースフィルターを設定することでこれが簡単に可能になります。
リポジトリメソッドを使用する場合、@SourceFilters アノテーションがあります。
interface BookRepository extends Repository<Book, String> {
@SourceFilters(includes = "name")
SearchHits<Book> findByName(String text);
} この例では、返される Book オブジェクトのプロパティは、名前を除いてすべて null になります。
アノテーションベースの構成
Spring Data Elasticsearch リポジトリのサポートは、JavaConfig を介したアノテーションを使用してアクティブ化できます。
@Configuration
@EnableElasticsearchRepositories( (1)
basePackages = "org.springframework.data.elasticsearch.repositories"
)
static class Config {
@Bean
public ElasticsearchOperations elasticsearchTemplate() { (2)
// ...
}
}
class ProductService {
private ProductRepository repository; (3)
public ProductService(ProductRepository repository) {
this.repository = repository;
}
public Page<Product> findAvailableBookByName(String name, Pageable pageable) {
return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
}
}| 1 | EnableElasticsearchRepositories アノテーションは、リポジトリサポートをアクティブにします。基本パッケージが設定されていない場合は、配置されている設定クラスの 1 つが使用されます。 |
| 2 | Elasticsearch オペレーションの章に示されている構成の 1 つを使用して、型 ElasticsearchOperations の elasticsearchTemplate という名前の Bean を提供します。 |
| 3 | Spring がリポジトリ Bean をクラスに挿入します。 |
Spring ネームスペース
Spring Data Elasticsearch モジュールには、リポジトリ Bean の定義と、ElasticsearchServer をインスタンス化するための要素を可能にするカスタム名前空間が含まれています。
repositories 要素を使用すると、リポジトリインスタンスの作成に従って Spring Data リポジトリが検索されます。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:repositories base-package="com.acme.repositories" />
</beans>Transport Client または Rest Client 要素を使用すると、コンテキストに Elasticsearch Server のインスタンスが登録されます。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:transport-client id="client" cluster-nodes="localhost:9300,someip:9300" />
</beans><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<elasticsearch:rest-client id="restClient" hosts="http://localhost:9200">
</beans>