Solr[源码详解]

3 篇文章 0 订阅

前言

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值