Elasticsearch リポジトリ

この章では、Elasticsearch リポジトリの実装の詳細について説明します。

例 1: サンプル 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 を介したアノテーションを使用してアクティブ化できます。

例 2: JavaConfig を使用する Spring Data Elasticsearch リポジトリ
@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);
  }
}
1EnableElasticsearchRepositories アノテーションは、リポジトリサポートをアクティブにします。基本パッケージが設定されていない場合は、配置されている設定クラスの 1 つが使用されます。
2Elasticsearch オペレーションの章に示されている構成の 1 つを使用して、型 ElasticsearchOperations の elasticsearchTemplate という名前の Bean を提供します。
3Spring がリポジトリ Bean をクラスに挿入します。

Spring ネームスペース

Spring Data Elasticsearch モジュールには、リポジトリ Bean の定義と、ElasticsearchServer をインスタンス化するための要素を可能にするカスタム名前空間が含まれています。

repositories 要素を使用すると、リポジトリインスタンスの作成に従って Spring Data リポジトリが検索されます。

例 3: 名前空間を使用した Elasticsearch リポジトリの設定
<?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 のインスタンスが登録されます。

例 4: ネームスペースを使用したトランスポートクライアント
<?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>
例 5: ネームスペースを使用する Rest クライアント
<?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>