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>