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);