Spring Data Solrの概要
1. 概要
この記事では、実用的な方法でwe’ll explore the basics of Spring Data Solrを使用します。
Apache Solrは、エンタープライズ全文検索エンジンをすぐに展開できるオープンソースです。 Solrの機能の詳細については、official websiteを参照してください。
簡単なSolr構成を行う方法と、もちろんサーバーと対話する方法を示します。
まず、Solrサーバーを起動し、データを保存するコアを作成する必要があります(デフォルトでは、Solrはスキーマレスモードで作成します)。
2. 春のデータ
他のSpringDataプロジェクトと同様に、Spring Data Solrには、ボイラープレートコードを削除するという明確な目標があり、これを確実に活用します。
2.1. メーベン依存
Spring Data Solrの依存関係をpom.xmlに追加することから始めましょう。
org.springframework.data
spring-data-solr
2.0.5.RELEASE
最新の依存関係hereを見つけることができます。
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としてProductとStringを使用して、これを自然にパラメータ化します。
public interface ProductRepository extends SolrCrudRepository {
public List findByName(String name);
@Query("id:*?0* OR name:*?0*")
public Page findByCustomQuery(String searchTerm, Pageable pageable);
@Query(name = "Product.findByNamedQuery")
public Page 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.example.spring.data.solr.repository",
namedQueriesLocation = "classpath:solr-named-queries.properties",
multicoreSupport = true)
@ComponentScan
public class SolrConfig {
@Bean
public SolrClient solrClient() {
return new HttpSolrClient("http://localhost:8983/solr");
}
@Bean
public SolrTemplate solrTemplate(SolrClient client) throws Exception {
return new SolrTemplate(client);
}
}
@EnableSolrRepositoriesを使用して、リポジトリのパッケージをスキャンしています。 名前付きクエリプロパティファイルの場所を指定し、マルチコアサポートを有効にしていることに注意してください。
マルチコアが有効になっていない場合、デフォルトでSpring DataはSolr構成がシングルコア用であると想定します。 参考までに、ここではマルチコアを有効にしています。
3. インデックス作成、更新、削除
Solrで文書を検索するには、文書をSolrリポジトリーに索引付けする必要があります。
次の例では、SolrCrudRepository’s saveメソッドを使用するだけで、Solrリポジトリ内の製品ドキュメントにインデックスを付けます。
Product phone = new Product();
phone.setId("P0001");
phone.setName("Phone");
productRepository.save(phone);
それでは、ドキュメントを取得して更新しましょう。
Product retrievedProduct = productRepository.findOne("P0001");
retrievedProduct.setName("Smart Phone");
productRepository.save(retrievedProduct);
削除メソッドを呼び出すだけで、ドキュメントを削除できます。
productRepository.delete(retrievedProduct);
4. 問い合わせ
ここで、Spring Data SolrAPIによって提供されるさまざまなクエリ手法について見ていきましょう。
4.1. メソッド名クエリの生成
メソッド名ベースのクエリは、メソッド名を解析して、実行するクエリを生成することにより生成されます。
public List findByName(String name);
リポジトリインターフェイスには、メソッド名に基づいてクエリを生成するfindByNameメソッドがあります。
List retrievedProducts = productRepository.findByName("Phone");
4.2. @Queryアノテーションを使用したクエリ
Solr検索クエリは、メソッドの@Queryアノテーションにクエリを含めることで作成できます。 この例では、findByCustomQueryに@Queryアノテーションが付けられています。
@Query("id:*?0* OR name:*?0*")
public Page findByCustomQuery(String searchTerm, Pageable pageable);
このメソッドを使用してドキュメントを取得しましょう。
Page result
= productRepository.findByCustomQuery("Phone", new PageRequest(0, 10));
findByCustomQuery(“Phone”, new PageRequest(0, 10))を呼び出すことにより、フィールドidまたはnameのいずれかに「電話」という単語を含む製品ドキュメントの最初のページを取得します。
4.3. 名前付きクエリ
名前付きクエリは、クエリが別のプロパティファイルで宣言されていることを除いて、@Queryアノテーションが付いたクエリに似ています。
@Query(name = "Product.findByNamedQuery")
public Page findByNamedQuery(String searchTerm, Pageable pageable);
プロパティファイルのクエリのキー(findByNamedQuery)がメソッド名と一致する場合、@Queryアノテーションは必要ないことに注意してください。
名前付きクエリメソッドを使用していくつかのドキュメントを取得しましょう。
Page result
= productRepository.findByNamedQuery("one", new PageRequest(0, 10));
5. 結論
この記事は、Spring Data Solrの簡単で実用的な入門書であり、基本構成、リポジトリーの定義、および自然な照会をカバーしています。
そしていつものように、ここで使用される例はsample project on Githubとして利用できます。