Apache Solrj 简介
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 Dashboard来验证它是否已成功启动。
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 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 兼容,需要将*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 进行索引
您还可以使用 beans 索引 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将包含一个SolrDocument对象列表,该对象与格式为field:value 的任何查询匹配。在本例中,我们按价格查询:
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);