转载自: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. jquery navi

    /// <reference path="../global.js" /> /********************************************* ...

  2. python计算机视觉1:基本操作与直方图

    本文主要内容来源于书籍<python计算机视觉编程> 我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢 PIL模块 PIL模块全程为Python Imaging Library,是 ...

  3. 读mongoose api 记录

    mongoose 需要在Schemas基础上进行使用 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var blo ...

  4. Effective Java2读书笔记-类和接口(五)

    第21条:用函数对象表示策略 这一条其实也没说啥,就是策略模式.碰到这种场景时,定义一个策略接口,然后不同策略子类实现它,主类包含这个接口的引用就可以了. 第22条:优先考虑静态成员类 嵌套类是指被定 ...

  5. poj2484--A Funny♂Game

    题意:n个硬币围成环,每次可以取相邻两个硬币或者一个,不能取者负. Ans:n<=2的时候先手必胜,其他任意情况后手必胜,因为不论我先手取什么,我后手总有中心对称与它配对. #include&l ...

  6. openssl对数组加密解密的完整实现代码

    本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码. #include <stdio.h> #include <string.h> #in ...

  7. java classpath import package 机制 @Java的ClassPath, Package和Jar

    java classpath import package 机制   從一個簡單的例子談談package與import機制 基本原則:為什麼需要將Java文件和類文件切實安置到其所歸屬之Package ...

  8. MySQL强制性操作

    1.强制索引FORCE INDEX SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … 只使用建立在FIELD1上的索引,而不使用其它字段上的索引. 2.忽略索引 ...

  9. Friendly number

    Friendly number Long numbers can be made to look nicer, so let’s write some code to do just that. Yo ...

  10. 【剑指offer】面试题32:从1到n整数中1出现的次数

    题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...