Apache SolrJを使用したJavaのSolrガイド
1. 概要
Apache Solrは、Lucene上に構築されたオープンソースの検索プラットフォームです。 Apache SolrJはSolrのJavaベースのクライアントであり、ドキュメントのインデックス作成、クエリ、削除などの検索の主な機能のインターフェースを提供します。
この記事では、how to interact with an Apache Solr server using SolrJについて説明します。
2. セットアップ
マシンにSolrサーバーをインストールするには、Solr QuickStart Guideを参照してください。
インストールプロセスは簡単です。zip/ tarパッケージをダウンロードし、内容を抽出し、コマンドラインからサーバーを起動するだけです。 この記事では、「bigboxstore」というコアを持つSolrサーバーを作成します。
bin/solr start
bin/solr create -c 'bigboxstore'
デフォルトでは、Solrは着信HTTPクエリをポート8983でリッスンします。 ブラウザでhttp://localhost:8983/solr/#/bigboxstore URLを開き、Solrダッシュボードを観察することで、正常に起動されたことを確認できます。
3. Mavenの構成
Solrサーバーが稼働しているので、SolrJ Javaクライアントに直接ジャンプしましょう。 プロジェクトでSolrJを使用するには、pom.xmlファイルで次のMaven依存関係を宣言する必要があります。
org.apache.solr
solr-solrj
6.4.0
Maven Centralでホストされている最新バージョンをいつでも見つけることができます。
4. Apache SolrJ Java API
Solrサーバーに接続してSolrJクライアントを起動しましょう。
String urlString = "http://localhost:8983/solr/bigboxstore";
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());
注:デフォルトの応答形式としてのSolrJ uses a binary format, rather than XML。 Solrとの互換性のために、上記のようにXMLに対してsetParser()を明示的に呼び出す必要があります。 これに関する詳細はhereで見つけることができます。
4.1. ドキュメントのインデックス作成
SolrInputDocumentを使用してインデックスを作成するデータを定義し、add()メソッドを使用してインデックスに追加しましょう。
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("name", "Kenmore Dishwasher");
document.addField("price", "599.99");
solr.add(document);
solr.commit();
注:Solrデータベースを変更するアクションでは、アクションの後にcommit()が続く必要があります。
4.2. Beansによるインデックス作成
You can also index Solr documents using beans。 プロパティに@Fieldアノテーションが付けられたProductBeanを定義しましょう。
public class ProductBean {
String id;
String name;
String price;
@Field("id")
protected void setId(String id) {
this.id = id;
}
@Field("name")
protected void setName(String name) {
this.name = name;
}
@Field("price")
protected void setPrice(String price) {
this.price = price;
}
// getters and constructor omitted for space
}
次に、Beanをインデックスに追加しましょう。
solrClient.addBean( new ProductBean("888", "Apple iPhone 6s", "299.99") );
solrClient.commit();
4.3. フィールドとIDによるインデックス付きドキュメントのクエリ
SolrQueryを使用してSolrサーバーにクエリを実行し、ドキュメントが追加されていることを確認しましょう。
サーバーからのQueryResponseには、field:valueの形式のクエリに一致するSolrDocumentオブジェクトのリストが含まれます。 この例では、価格で照会します。
SolrQuery query = new SolrQuery();
query.set("q", "price:599.99");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 1);
for (SolrDocument doc : docList) {
assertEquals((String) doc.getFieldValue("id"), "123456");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);
}
より簡単なオプションは、getById()を使用してIdでクエリを実行することです。 一致が見つかった場合、1つのドキュメントのみが返されます。
SolrDocument doc = solr.getById("123456");
assertEquals((String) doc.getFieldValue("name"), "Kenmore Dishwasher");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);
4.4. ドキュメントを削除する
インデックスからドキュメントを削除する場合は、deleteById()を使用して、ドキュメントが削除されたことを確認できます。
solr.deleteById("123456");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);
deleteByQuery()のオプションもあるので、特定の名前のドキュメントを削除してみましょう。
solr.deleteByQuery("name:Kenmore Dishwasher");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);
5. 結論
この簡単な記事では、SolrJ Java APIを使用して、Apache Solr全文検索エンジンとの一般的なやり取りのいくつかを実行する方法を見てきました。
この記事over on GitHubで提供されている例を確認できます。