1. 概要

Apache Solr は、Lucene上に構築されたオープンソースの検索プラットフォームです。 Apache SolrJは、Solr用のJavaベースのクライアントであり、ドキュメントの索引付け、照会、削除などの検索の主な機能のためのインターフェースを提供します。

この記事では、SolrJを使用してApacheSolrサーバーと対話する方法について説明します。

2. 設定

お使いのマシンにSolrサーバーをインストールするには、Solrクイックスタートガイドを参照してください。

インストールプロセスは簡単です。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サーバーが稼働しているので、SolrJJavaクライアントに直接ジャンプしましょう。 プロジェクトでSolrJを使用するには、pom.xmlファイルで次のMaven依存関係を宣言する必要があります。

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.4.0</version>
</dependency>

MavenCentralによってホストされている最新バージョンをいつでも見つけることができます。

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は、デフォルトの応答形式としてXMLではなくバイナリ形式を使用します。 Solrとの互換性のために、上記のようにXMLに対して setParser()を明示的に呼び出す必要があります。 詳細については、こちらをご覧ください。

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を使用したインデックス作成

Beansを使用してSolrドキュメントにインデックスを付けることもできます。 プロパティに@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を使用して、ApacheSolr全文検索エンジンとの一般的な対話のいくつかを実行する方法を見てきました。

この記事で提供されている例をGitHubで確認できます。