SolrJ

依赖

Maven:

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

SolrClient

SolrClient是SolrJ的核心接口,所有的请求都要通过它发送Solr服务器,它负责处理与Solr的连接和通信。它的实现有:

  • HttpSolrClient 基于Http的通用客户端,直接与单个Solr节点通信。
  • Http2SolrClient 该类是实验用的,生产环境不要使用。
  • LBHttpSolrClient 负载均衡客户端,能够根据节点状态动态更新负载节点。
  • LBHttp2SolrClient 基于Http2SolrClient,也是实验用的。
  • CloudSolrClient 面向SolrCloud部署模式,根据Zookeeper来发现节点,路由请求。
  • ConcurrentUpdateSolrClient 主要用于索引数据,当数据过大时内部会缓存。

创建SolrClient实例:

final String solrUrl = "http://localhost:8983/solr";
return new HttpSolrClient.Builder(solrUrl)
    .withConnectionTimeout(10000)
    .withSocketTimeout(60000)
    .build();

url指定了连接地址和端口号,也可以在连接地址中指明collection,那样的话在查询的时候就不用指明collection了。

查询

SolrClient对象提供了多种query方法,每个方法都接受一个SolrParam参数,它其实是一个map结构。所有query方法都返回一个QueryResponse对象,通过它可以访问搜索结果文档和其他元数据。

下面是一个在techproducts搜索的例子。

final SolrClient client = getSolrClient();

final Map<String, String> queryParamMap = new HashMap<String, String>();
queryParamMap.put("q", "*:*");
queryParamMap.put("fl", "id, name");
queryParamMap.put("sort", "id asc");
MapSolrParams queryParams = new MapSolrParams(queryParamMap);

final QueryResponse response = client.query("techproducts", queryParams);
final SolrDocumentList documents = response.getResults();

print("Found " + documents.getNumFound() + " documents");
for(SolrDocument document : documents) {
  final String id = (String) document.getFirstValue("id");
  final String name = (String) document.getFirstValue("name");

  print("id: " + id + "; name: " + name);
}

SolrParam有一个子类SolrQuery,它封装了Solr的查询参数,从而方便用户使用。

final SolrQuery query = new SolrQuery("*:*");
query.addField("id");
query.addField("name");
query.setSort("id", ORDER.asc);
query.setRows(numResultsToReturn);