Solr[源码详解]
前言
技术延展的同时Solr已经成为一名Java程序员必备的一项技能,下面我将自己目前所掌握的与大家分享,希望各位能有所收获。
目录
1.创建Solr 对象 获取连接
- 创建Solr对象 获取连接
- 创建Query对象
- 分页处理
- 设置查询条件
- 排序
- 获取页数
- 关闭连接
String solrUrl = “http://10.4.156.221:8983/solrCore”
SolrCilent solr= new HttpSolrClient(solrUrl);
第一步:
获取Solr的连接地址,分别对应:IP+端口号+SolrCore,其中solrCore为创建Solr时用户自定义的名称,见名知意就是Solr核心。
第二步:
创建连接。
其中:
HttpSolrClient继承于SolrClient,直接已知子类:HttpSolrServer。通过HTTP直接与Solr服务器通信的SolrClient实现有两种方法:
1)将URL传递给直接指向特定核心的构造函数
SolrClient client = new HttpSolrClient(“http:// my-solr-server:8983 / solr / core1”);
QueryResponse resp = client.query(new SolrQuery(“*:*”));
在这种情况下,可以直接查询给定的核心,但无法查询任何其他核心或使用此客户端发出CoreAdmin请求。
2)将节点的基本URL传递给构造函数
SolrClient client = new HttpSolrClient(“http:// my-solr-server:8983 / solr”);
QueryResponse resp = client.query(“core1”,new SolrQuery(“*:*”));
在这种情况下,必须为所有查询和更新传递所需核心的名称,但可以对所有核心和CoreAdmin请求使用相同的客户端。
2.创建Query对象
SolrQuery query = new SolrQuery();
通过查询官网我们可以看到,SolrQuery均已实现序列化接口,其直接父类是ModifiableSolrParams,下面也会讲到。下面简单截取几个我们下面将要用到的方法,更多的请访问官方API地址:
http://lucene.apache.org/solr/4_2_1/solr-solrj/org/apache/solr/client/solrj/SolrQuery.html
二者结合用来实现分页。
用来排序。
3.分页处理
query.setStart(“0”);
query.setRows(“10”);
设置每页显示十条记录。
4.设置查询条件
if (StringUtils.isEmpty(params)) //形参传进来的params
{
params=“*:*”;
}
query.set(“q”,params);
*:*,意思是:查找名为第一个*里包括第二个*的所有符合的记录,如:“name:zhangsan”就是查找name字段中名为zhangsan的记录。
深入研究一下这个set的源码就会发现,底层是这样的:
Public ModifiableParams set(String name, String ... val){
if(val == null || (val.length==1 && val[0]== null )) {
val.remove(name);
} else {
val.put(name,val)
}
return this;
}
源码很清晰在这我就不再赘述。
5.排序
query.setSort(“age”,ORDER.asc)
显然就是按照年龄,升序排序,同样的我们来看一下底层源码:
Public SolrQuery setSort(String field , ORDER order) {
return setSort(new SortClause(field,order));
}
注意看形参是不一样的,接着进入这个setSort()方法
Public SolrQuery setSort(SortClause sortClause) {
clearSorts();
return addSort(sortClause);
}
往里进入,看一下clearSorts()方法
Public SolrQuery clearSorts() {
solrClauses = null;
serializeSorts(); //序列化,就不在做进一步深入了
return this;
}
往里进入,看一下serializeSorts()方法
Private void serializeSorts() {
if (solrClauses == null || solrClauses.isEmpty()) {
remove(CommonParams.SORT); //枚举值对应sort
} else {
StringBuilder sb = new StringBuilder();
for (SortClause sortClause : sortClauses) {
if (sb.length() > 0) sb.append(“,”)
sb.append(sortClause.getItem());
sb.append(“ ”);
sb.append(sortClause.getOrder());
}
set(CommonParams.SORT,sb.toString());
}
剩下一些方法不是核心,这里就不带大家进一步深入了,源码很清晰同样不再赘述。
6.获取页数
QueryResponse queryResponse = sorl.query(query);
List list = queryResponse.getBean(Pojo.class) //获取查询结果集
Long count = queryResponse.getResults().getNumFound();
同样,源码走一波,首先进入getResult()方法:
Public SolrDocumentList getResults() {
return _results;
}
接着进入getNumFound()底层瞅一眼:
Public long getNumFound()
{
return numFound;
}
7.关闭连接
solr.close();
大家跟着我最后在走进这个看一下:
Public void close() throws IOException() {
shutdown();
}
我在查看的时候,这个shutdown();显示已经过时,同样我们一起看下,很简单
Public abstract void shutdown();
就这样,没了。
好了,关于Solr的使用流程我们刚已经从表面的运用到底层的源码基本看了一遍,希望各位有所收获,由于所有代码都是我手敲的,所有可能存在部分错误,请谅解。