转载自:http://www.cnblogs.com/huangfox/archive/2012/02/09/2344686.html

solr-searching过程分析(一)

——searching过程粗略梳理

下午看了一会solr的启动过程,往细的看相当繁琐。换个头绪先看看solr的searching过程。

1.拦截请求,解析请求并构建相应的handler。

发送检索请求,例如:http://localhost:8983/solr3.5/core2/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on

首先他将被SolrDispatchFilter拦截。

doFilter(ServletRequest
request, ServletResponse response, FilterChain chain)

通过对request的分析,获知当前request是做什么的(/select),并构造相应的handler(SearchHandler)。

2.SolrCore出面处理上层工作(具体工作交由handler处理)

将handler、SolrQueryRequest、SolrQueryResponse交由solrCore的execute方法处理

public void execute(SolrRequestHandler
handler, SolrQueryRequest req, SolrQueryResponse rsp)

在该方法中主要还是由handler来完成的。

SolrRequestHandler是一个接口,他主要的方法就是:

public void handleRequest(SolrQueryRequest
req, SolrQueryResponse rsp);

SolrRequestHandler的实现类的结构图如下:

其中RequestHandlerBase为大部分的Handler实现了部分功能,主要包括

public void handleRequest(SolrQueryRequest
req, SolrQueryResponse rsp){
  ......
  handleRequestBody(
req, rsp );
  ......
}

然而具体怎么做就交给具体的子类去执行了!(handleRequestBody( req, rsp );)

例如:这里是做检索,那么就交由SearchHandler处理。

(这里的设计方式有点类似于servlet,GenericSerlet实现了一些公用方法,而具体的则有其子类完成,例如HttpServlet)

3.SearchHandler具体的检索过程

现在的检索没有使用shards,在跟踪代码的过程中,发现以下过程是检索的主要环节。

if(!rb.isDebug())
{
        //
Process
        for(
SearchComponent c : components ) {
         <strong>
c.process(rb);</strong>
        }
      }

从中可知真正的检索需要经过多个SearchComponent,在当前的实验环境下包括6个,如下:

4.各个SearchComponent配合工作完成检索

我们先重点了解QueryComponent。

获得SolrIndexSearcher,这个对象是检索的主要执行者。

同时获取SolrIndexSearcher.QueryCommand、SolrIndexSearcher.QueryResult,并将其作为查询条件和查询结果提交给SolrIndexSearcher进行检索。

searcher.search(result,cmd);

在SolrIndexSearcher中search方法如下:

public QueryResult
search(QueryResult qr, QueryCommand cmd)
throws IOException
{
    <strong>getDocListC(qr,cmd);</strong>
    return qr;
  }

getDocListC又是一个比较复杂的方法,在这里加入的cache。

如果当前检索被缓存了(缓存也是个重点内容,后续详细分析!),那么直接返回结果,否则重新进行检索,检索的方法是:

private void getDocListNC(QueryResult
qr,QueryCommand cmd)

在该方法中,和我们使用lucene进行检索十分相似,采用的具体方法是:

super.search(query,
luceneFilter, collector);

检索完成将结果进行封装,放入QueryResult当中。

qr.setDocList(new DocSlice(0,sliceLen,ids,scores,totalHits,maxScore));

检索完成后,将结果放入缓存中,“造福后人”!

至此QueryComponent的工作就算完成了。

如果做简单查询(如:http://localhost:8983/solr3.5/core2/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on

那么后面5个Component就直接过了(没有真正被执行)。

5.收尾工作

将结果封装好,写入相应的ResponseHeaders,关闭SolrQueryRequest、solrCore。

-----------------------------------------------------

以上是solr-searching最粗略的过程,本着先脉络后细节的思想,以后再对各个重要环节做深入分析。

searching主要执行方法如下:

SolrDispatchFilter(doFilter,execute)

->SolrCore(execute)

->RequestHandlerBase(handleRequest)

->SearchHandler(handleRequestBody) //有可能执行多个Component

->QueryComponent(process)

->SolrIndexSearcher(search,getDocListC)

【转载】 Searching过程粗略梳理的更多相关文章

  1. 【转载】 Searching过程粗略梳理 分类: H4_SOLR/LUCENCE 2014-07-25 22:59 316人阅读 评论(0) 收藏

    转载自:http://www.cnblogs.com/huangfox/archive/2012/02/09/2344686.html solr-searching过程分析(一) --searchin ...

  2. OPRNGL之渲染过程大概梳理

    将OPENGL绘制对象的过程类比为摄像机拍摄物体的过程 视图变换:对摄像机位置与朝向(还有朝上朝下)进行定义 模型变换:对物体的位置,旋转,缩放进行定义 以上是对摄像机和物体的两个基础定义 投影:对摄 ...

  3. 转载:XGBOOST算法梳理

    学习内容: CART树 算法原理 损失函数 分裂结点算法 正则化 对缺失值处理 优缺点 应用场景 sklearn参数 转自:https://zhuanlan.zhihu.com/p/58221959 ...

  4. 转载:GBDT算法梳理

    学习内容: 前向分布算法 负梯度拟合 损失函数 回归 二分类,多分类 正则化 优缺点 sklearn参数 应用场景 转自:https://zhuanlan.zhihu.com/p/58105824 G ...

  5. elasticsearch-1.3.0 之索引代码粗略梳理

    elasticsearch-1.3.0 发送请求 创建 [root@centos ~]# curl -XPUT 172.16.136.159:9200/customer?pretty { " ...

  6. Zookeeper 3.4.6 Client端流程粗略梳理

    首先从Zookeeper入手,Zookeeper-->ClientCnxn-->sendThread/eventThread public ZooKeeper(String connect ...

  7. zookeeper 3.4.6启动流程粗略梳理

    zookeeper 3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" " ...

  8. IPsec传输模式下ESP报文的装包和拆包过程

    原创文章,拒绝转载 装包过程 总体流程图 过程描述 在原IP报文中找到TCP报文部分,在其后添加相应的ESP trailer信息. ESP trailer 包含三部分:Padding,Pad leng ...

  9. Hadoop2.5.2+HA+zookeeper3.4.6详细配置过程

    心血之作,在熟悉hadoop2架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间.最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠.这篇文章中,我也 ...

随机推荐

  1. pyopenssl

    https://pyopenssl.readthedocs.org/en/stable/ pyopenssl是一个封装了openssl的python模块. 使用它可以方便地进行一些加解密操作. 1.产 ...

  2. Truck History--poj1789

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21534   Accepted: 8379 De ...

  3. Nasty Hacks <入门练手题>

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. ASP.NET学习笔记——ASP.NET应用程序

    0 剖析ASP.NET应用程序 用户运行ASP.NET应用程序,不是直接运行,而是使用浏览器(比如IE)通过HTTP请求一个特定的URL(如http://www.mysite.com/mypage.a ...

  5. 观《Terminal》之感

    读书笔记系列链接地址http://www.cnblogs.com/shoufengwei/p/5714661.html.        经人推荐,用了几天时间欣赏了这部斯皮尔伯格导演的电影<Te ...

  6. 前端面试题之js篇

    前端面试也可为是鱼龙混杂,各公司面试题的种类也大不相同,有的公司注重基础语法,面试题偏于ES,有的公司偏于页面逻辑,会考差一些js的应用,现将遇到过的题和典型的题整理一下. 1. 0.2-0.1 == ...

  7. PHP中$_GET['name']与$_POST['name']变量直接用变量名$name的php配置

    php中,可以直接使用参数名称作为变量来接收get或post的传参,条件是php.ini中register_global设置成On 另外一种方法: if(!ini_get('register_glob ...

  8. 车的UML图

    车的UML图,涉及到集合与泛化的东东. UML统一建模语言,通过图能够很好的分析问题.

  9. 如何判断是REQUEST请求是来自移动终端还是来自PC端

    public bool IsMoblie()        {            string agent = (Request.UserAgent + "").ToLower ...

  10. ie6下a标签的onclick事件不执行问题解决方案

    <a href="javascript:void(0)" onclick="loadiframe()">点我咯</a> <scri ...