1. 概述

Apache Solr 是一个基于 Lucene 的开源搜索平台。Apache SolrJ 是一个基于 Java 的 Solr 客户端,它提供了索引、查询和删除文档等主要搜索功能的接口。

本文将探讨如何使用 SolrJ 与 Apache Solr 服务器进行交互。

2. 安装设置

要在你的机器上安装 Solr 服务器,请参考 Solr 快速入门指南

安装过程很简单:只需下载 zip 或 tar 包,提取内容,然后从命令行启动服务器。对于本文,我们将创建一个名为 'bigboxstore' 的 Solr 核心:

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

默认情况下,Solr 会监听 8983 端口以接收 HTTP 查询。你可以在浏览器中打开 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>

你可以随时在 Maven 中央仓库找到最新版本。

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 兼容,需要显式调用 setParser() 设置为 XML,如上所示。更多细节请参阅 这里

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 文档。 让我们定义一个 ProductBean,其属性标记为 @Field

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,如果找到匹配项,它将只返回一个文档:

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 全文搜索引擎进行一些常见的交互。

你可以查看本文提供的示例 在 GitHub 上