欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Solr[源码详解]

程序员文章站 2022-07-09 15:28:27
...

前言

     技术延展的同时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();

Solr[源码详解]

       通过查询官网我们可以看到,SolrQuery均已实现序列化接口,其直接父类是ModifiableSolrParams,下面也会讲到。下面简单截取几个我们下面将要用到的方法,更多的请访问官方API地址:

http://lucene.apache.org/solr/4_2_1/solr-solrj/org/apache/solr/client/solrj/SolrQuery.html

Solr[源码详解]

         二者结合用来实现分页。

Solr[源码详解]

          用来排序。

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的使用流程我们刚已经从表面的运用到底层的源码基本看了一遍,希望各位有所收获,由于所有代码都是我手敲的,所有可能存在部分错误,请谅解。

 

相关标签: Solr