solrJ是一个用来访问solr的Java客户端,提供了索引和搜索的方法(将一些常用的命令封装进去了),通过solrJ提供的API 接口来操作solr服务。
依赖:
SolrJ的核心API<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.7.3</version>
</dependency>
- SolrClient
- SolrRequest
- SolrResponse
HttpSolrClient – 与指定的一个solr节点通信的客户端
LBHttpSolrClient –负载均衡地访问一组节点的客户端
CloudSolrClient – 访问solrCloud的客户端
ConcurrentUpdateSolrClient –并发更新索引用的客户端
创建客户端时,通用的配置选项- Base URL
- Timeouts
Base URL 基础URL
http://hostname:8983/solr/core1
http://hostname:8983/solr
Timeouts
final String solrUrl = "http://localhost:8983/solr";
return new HttpSolrClient.builder(solrUrl)
.withConnectionTimeout(10000)
.build();
SolrJ使用
索引文档
final SolrClient client = getSolrClient();
final SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "Amazon Kindle Paperwhite");
final UpdateResponse updateResponse = client.add("techproducts", doc);
// Indexed documents must be committed
client.commit("techproducts");
用SolrJ查询
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();
for(SolrDocument document : documents) {
final String id = (String) document.getFirstValue("id");
final String name = (String) document.getFirstValue("name");
......
}
Java 对象绑定
public static class TechProduct {
@Field public String id;
@Field public String name;
public TechProduct(String id, String name) {
this.id = id; this.name = name;
}
public TechProduct() {}
}
添加索引
final SolrClient client = getSolrClient();
final TechProduct kindle = new TechProduct("kindle-id-4", "Amazon Kindle Paperwhite");
final UpdateResponse response = client.addBean("techproducts", kindle);
client.commit("techproducts");
查询
final SolrClient client = getSolrClient();
final SolrQuery query = new SolrQuery("*:*");
query.addField("id");
query.addField("name");
query.setSort("id", ORDER.asc);
final List<TechProduct> products = response.getBeans(TechProduct.class);
查询Demo
public class SolrJClientDemo {
// baseSolrUrl 示例
private static String baseSolrUrl = "http://localhost:8983/solr/";
private static String baseSolrUrlWithCollection = "http://localhost:8983/solr/techproducts";
/**
* HttpSolrClient:与一个solr Server 通过http进行通信
*/
public static SolrClient getHttpSolrClient(String baseSolrUrl) {
return new HttpSolrClient.Builder(baseSolrUrl)
.withConnectionTimeout(1000).withSocketTimeout(6000).build();
}
public static SolrClient getHttpSolrClient() {
return new HttpSolrClient.Builder(baseSolrUrl)
.withConnectionTimeout(1000).withSocketTimeout(6000).build();
}
/**
* LBHttpSolrClient: 负载均衡的httpSolrClient <br>
* 负载均衡方式: 轮询给定的多个solr server url。
* 当某个url不通时,url地址会从活跃列表移到死亡列表中,用下一个地址再次发送请求。<br>
* 对于死亡列表中的url地址,会定期(默认每隔1分钟,可设置)去检测是否变活了,再加入到活跃列表中。 <br>
* 注意: <br>
* 1、不可用于主从结构master/slave 的索引场景,因为主从结构必须通过主节点来更新。 <br>
* 2、对于SolrCloud(leader/replica),使用CloudSolrClient更好。
* 在solrCloud中可用它来进行索引更新,solrCloud中的节点会将请求转发到对应的leader。
*/
public static SolrClient getLBHttpSolrClient(String... solrUrls) {
return new LBHttpSolrClient.Builder().withBaseSolrUrls(solrUrls)
.build();
}
private static String baseSolrUrl2 = "http://localhost:7001/solr/";
public static SolrClient getLBHttpSolrClient() {
return new LBHttpSolrClient.Builder()
.withBaseSolrUrls(baseSolrUrl, baseSolrUrl2).build();
}
/**
* 访问SolrCloud集群用CloudSolrClient<br>
* CloudSolrClient 实例通过访问zookeeper得到集群中集合的节点列表,<br>
* 然后通过LBHttpSolrClient来负载均衡地发送请求。<br>
* 注意:这个类默认文档的唯一键字段为“id”,如果不是的,通过 setIdField(String)方法指定。
*/
public static SolrClient getCloudSolrClient(List<String> zkHosts,
Optional<String> zkChroot) {
return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
}
private static String zkServerUrl = "localhost:9983";
public static SolrClient getCloudSolrClient() {
List<String> zkHosts = new ArrayList<String>();
zkHosts.add(zkServerUrl);
Optional<String> zkChroot = Optional.empty();
return new CloudSolrClient.Builder(zkHosts, zkChroot).build();
}
public static void main(String[] args) throws Exception {
// HttpSolrClient 示例:
SolrClient client = SolrJClientDemo.getHttpSolrClient();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "HttpSolrClient");
UpdateResponse updateResponse = client.add("techproducts", doc);
// 记得要提交
client.commit("techproducts");
System.out.println("------------ HttpSolrClient ------------");
System.out.println("add doc:" doc);
System.out.println("response: " updateResponse.getResponse());
client.close();
// LBHttpSolrClient 示例
client = SolrJClientDemo.getLBHttpSolrClient();
doc.clear();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "LBHttpSolrClient");
updateResponse = client.add("techproducts", doc);
// 记得要提交
client.commit("techproducts");
System.out.println("------------ LBHttpSolrClient ------------");
System.out.println("add doc:" doc);
System.out.println("response: " updateResponse.getResponse());
client.close();
// CloudSolrClient 示例
client = SolrJClientDemo.getCloudSolrClient();
doc.clear();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "CloudSolrClient");
updateResponse = client.add("techproducts", doc);
// 记得要提交
client.commit("techproducts");
System.out.println("------------ CloudSolrClient ------------");
System.out.println("add doc:" doc);
System.out.println("response: " updateResponse.getResponse());
client.close();
}
}
,