1. 概要

この記事では、 Spring DataSolrの基本を実際的な方法で探ります。

Apache Solrは、すぐにデプロイできるオープンソースのエンタープライズ全文検索エンジンです。 Solrの機能の詳細については、公式Webサイトを参照してください。

簡単なSolr構成を行う方法と、もちろんサーバーと対話する方法を示します。

まず、Solrサーバーを起動し、データを格納するためのコアを作成する必要があります(デフォルトでは、Solrはスキーマレスモードで作成します)。

2. 春のデータ

他のSpringデータプロジェクトと同様に、Spring Data Solrには、ボイラープレートコードを削除するという明確な目標があります。これは間違いなく利用します。

2.1. Mavenの依存関係

SpringDataSolr依存関係をpom.xmlに追加することから始めましょう。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>4.3.14</version>
</dependency>

最新の依存関係はここにあります。

2.2. ドキュメントの定義

Productというドキュメントを定義しましょう。

@SolrDocument(solrCoreName = "product")
public class Product {
   
    @Id
    @Indexed(name = "id", type = "string")
    private String id;

    @Indexed(name = "name", type = "string")
    private String name;

}

@SolrDocument アノテーションは、 Product クラスがSolrドキュメントであり、productという名前のコアにインデックス付けされていることを示します。 @Indexed で注釈が付けられたフィールドは、Solrで索引付けされ、検索可能になります。

2.3. リポジトリインターフェースの定義

次に、Spring Data Solrが提供するリポジトリーを拡張して、リポジトリー・インターフェースを作成する必要があります。 エンティティIDとしてProductStringを使用して、これを自然にパラメータ化します。

public interface ProductRepository extends SolrCrudRepository<Product, String> {

    public List<Product> findByName(String name);

    @Query("id:*?0* OR name:*?0*")
    public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);

    @Query(name = "Product.findByNamedQuery")
    public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);

}

SolrCrudRepository によって提供されるAPIに加えて、ここで3つのメソッドを定義していることに注目してください。 これらについては、次のいくつかのセクションで説明します。

また、 Product.findByNamedQuery プロパティは、クラスパスフォルダーのSolr名前付きクエリファイルsolr-named-queries.propertiesで定義されていることに注意してください。

Product.findByNamedQuery=id:*?0* OR name:*?0*

2.4. Java構成

次に、Solr永続層のSpring構成について説明します。

@Configuration
@EnableSolrRepositories(
  basePackages = "com.baeldung.spring.data.solr.repository",
  namedQueriesLocation = "classpath:solr-named-queries.properties")
@ComponentScan
public class SolrConfig {

    @Bean
    public SolrClient solrClient() {
        return new HttpSolrClient.Builder("http://localhost:8983/solr").build();
    }

    @Bean
    public SolrTemplate solrTemplate(SolrClient client) throws Exception {
        return new SolrTemplate(client);
    }
}

@EnableSolrRepositories を使用して、リポジトリのパッケージをスキャンしています。 名前付きクエリプロパティファイルの場所を指定し、マルチコアサポートを有効にしていることに注意してください。

マルチコアが有効になっていない場合、デフォルトでは、SpringDataはSolr構成がシングルコア用であると想定します。 参考までに、ここではマルチコアを有効にしています。

3. SpringBootを使用したSpringDataSolr

このセクションでは、Spring Bootアプリケーションでのセットアップがどのように見えるかを見ていきます。

Spring Boot StarterDataSolr依存関係をpom.xmlに追加することから始めましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
    <version>2.4.12</version>
</dependency>

依存関係の最新バージョンはここにあります。

また、application.propertiesファイルのプロパティspring.data.solr.hostをSolrURLの値で定義する必要があります。

spring.data.solr.host=http://localhost:8983/solr 

Solrが指定されたURLで実行されていることを確認してください。

これが、SpringBootアプリケーションでSpringData Solrをセットアップするために必要なすべての構成です。クラスパスにスターターがあると、自動構成がロードされるためです。

4. インデックス作成、更新、および削除

Solrでドキュメントを検索するには、ドキュメントをSolrリポジトリにインデックス付けする必要があります。

次の例では、 SolrCrudRepositoryの保存メソッドを使用するだけで、Solrリポジトリ内の製品ドキュメントにインデックスを付けます。

Product phone = new Product();
phone.setId("P0001");
phone.setName("Phone");
productRepository.save(phone);

それでは、ドキュメントを取得して更新しましょう。

Product retrievedProduct = productRepository.findById("P0001").get();
retrievedProduct.setName("Smart Phone");
productRepository.save(retrievedProduct);

ドキュメントは、deleteメソッドを呼び出すだけで削除できます。

productRepository.delete(retrievedProduct);

5. クエリ

次に、Spring DataSolrAPIによって提供されるさまざまなクエリ手法について見ていきましょう。

5.1. メソッド名クエリの生成

メソッド名ベースのクエリは、メソッド名を解析して、実行する予定のクエリを生成することによって生成されます。

public List<Product> findByName(String name);

リポジトリインターフェイスには、メソッド名に基づいてクエリを生成するfindByNameメソッドがあります。

List<Product> retrievedProducts = productRepository.findByName("Phone");

5.2. @Queryアノテーションを使用したクエリ

Solr検索クエリは、メソッドの@Queryアノテーションにクエリを含めることで作成できます。 この例では、findByCustomQuery@Queryアノテーションが付けられています。

@Query("id:*?0* OR name:*?0*")
public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);

このメソッドを使用してドキュメントを取得してみましょう。

Page<Product> result 
  = productRepository.findByCustomQuery("Phone", PageRequest.of(0, 10));

findByCustomQuery( “Phone”、PageRequest.of(0、10))を呼び出すことにより、フィールドid[のいずれかに「Phone」という単語を含む製品ドキュメントの最初のページを取得します。 X182X]または名前

5.3. 名前付きクエリ

名前付きクエリは、 @Query アノテーションが付いたクエリに似ていますが、クエリが別のプロパティファイルで宣言されている点が異なります。

@Query(name = "Product.findByNamedQuery")
public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);

プロパティファイルのクエリのキー( findByNamedQuery )がメソッド名と一致する場合、@Queryアノテーションは不要であることに注意してください。

名前付きクエリメソッドを使用していくつかのドキュメントを取得してみましょう。

Page<Product> result 
  = productRepository.findByNamedQuery("one", PageRequest.of(0, 10));

6. 結論

この記事は、Spring Data Solrの簡単で実用的な紹介であり、基本的な構成、リポジトリーの定義、そして当然のことながらクエリについて説明しています。

そしていつものように、ここで使用されている例は、Githubサンプルプロジェクトとして利用できます。