Apache SolrJによるJavaでのSolrのガイド

1概要

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

この記事では、SolrJを使ってApache Solrサーバーと対話する方法を探ります。

2セットアップ

あなたのマシンにSolrサーバをインストールするには、http://lucene.apache.org/solr/quickstart.html[Solrクイックスタートガイド]を参照してください。

インストールプロセスは簡単です - zip/tarパッケージをダウンロードし、内容を抽出して、コマンドラインからサーバーを起動するだけです。この記事では、「bigboxstore」というコアを持つSolrサーバーを作成します。

bin/solr start
bin/solr create -c 'bigboxstore'

デフォルトでは、Solrは着信HTTP照会をポート8983でlistenします。ブラウザで http://localhost:8983/solr/#/bigboxstore というURLを開き、Solrダッシュボードを見ることで、正しく起動されたことを確認できます。

3 Mavenの設定

Solrサーバーを稼働させたので、SolrJ Javaクライアントに直接ジャンプしましょう。プロジェクトでSolrJを使用するには、 pom.xml ファイルで次のMaven依存関係を宣言する必要があります。

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

https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.solr%22%20a%3A%22solr-solrj%22 によってホストされている最新バージョンをいつでも見つけることができます。 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は、デフォルトの応答形式としてXML ではなくバイナリー形式を使用します。 Solrとの互換性のために、上記のようにXMLに対して setParser() を明示的に呼び出す必要があります。これに関する詳細はhttps://cwiki.apache.org/confluence/display/solr/Using SolrJ[こちら]をご覧ください。

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. Beanを使った索引付け

  • Beanを使用して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によるインデックス付きドキュメントのクエリ

Solrサーバーへの照会に SolrQuery を使用して、文書が追加されたことを確認しましょう。

サーバーからの 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 にあるこの記事で提供されている例を確認することができます。