【转载】 Searching过程粗略梳理
转载自: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的分析,获知当前request是做什么的(/select),并构造相应的handler(SearchHandler)。
2.SolrCore出面处理上层工作(具体工作交由handler处理)
将handler、SolrQueryRequest、SolrQueryResponse交由solrCore的execute方法处理
public void execute(SolrRequestHandler |
在该方法中主要还是由handler来完成的。
SolrRequestHandler是一个接口,他主要的方法就是:
public void handleRequest(SolrQueryRequest |
SolrRequestHandler的实现类的结构图如下:

其中RequestHandlerBase为大部分的Handler实现了部分功能,主要包括
public void handleRequest(SolrQueryRequest ...... handleRequestBody( ......} |
然而具体怎么做就交给具体的子类去执行了!(handleRequestBody( req, rsp );)
例如:这里是做检索,那么就交由SearchHandler处理。
(这里的设计方式有点类似于servlet,GenericSerlet实现了一些公用方法,而具体的则有其子类完成,例如HttpServlet)
3.SearchHandler具体的检索过程
现在的检索没有使用shards,在跟踪代码的过程中,发现以下过程是检索的主要环节。
if(!rb.isDebug()) // for( <strong> } } |
从中可知真正的检索需要经过多个SearchComponent,在当前的实验环境下包括6个,如下:

4.各个SearchComponent配合工作完成检索
我们先重点了解QueryComponent。
获得SolrIndexSearcher,这个对象是检索的主要执行者。
同时获取SolrIndexSearcher.QueryCommand、SolrIndexSearcher.QueryResult,并将其作为查询条件和查询结果提交给SolrIndexSearcher进行检索。
searcher.search(result,cmd); |
在SolrIndexSearcher中search方法如下:
public QueryResultthrows IOException <strong>getDocListC(qr,cmd);</strong> return qr; } |
getDocListC又是一个比较复杂的方法,在这里加入的cache。
如果当前检索被缓存了(缓存也是个重点内容,后续详细分析!),那么直接返回结果,否则重新进行检索,检索的方法是:
private void getDocListNC(QueryResult |
在该方法中,和我们使用lucene进行检索十分相似,采用的具体方法是:
super.search(query, |
检索完成将结果进行封装,放入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过程粗略梳理的更多相关文章
- 【转载】 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 ...
- OPRNGL之渲染过程大概梳理
将OPENGL绘制对象的过程类比为摄像机拍摄物体的过程 视图变换:对摄像机位置与朝向(还有朝上朝下)进行定义 模型变换:对物体的位置,旋转,缩放进行定义 以上是对摄像机和物体的两个基础定义 投影:对摄 ...
- 转载:XGBOOST算法梳理
学习内容: CART树 算法原理 损失函数 分裂结点算法 正则化 对缺失值处理 优缺点 应用场景 sklearn参数 转自:https://zhuanlan.zhihu.com/p/58221959 ...
- 转载:GBDT算法梳理
学习内容: 前向分布算法 负梯度拟合 损失函数 回归 二分类,多分类 正则化 优缺点 sklearn参数 应用场景 转自:https://zhuanlan.zhihu.com/p/58105824 G ...
- elasticsearch-1.3.0 之索引代码粗略梳理
elasticsearch-1.3.0 发送请求 创建 [root@centos ~]# curl -XPUT 172.16.136.159:9200/customer?pretty { " ...
- Zookeeper 3.4.6 Client端流程粗略梳理
首先从Zookeeper入手,Zookeeper-->ClientCnxn-->sendThread/eventThread public ZooKeeper(String connect ...
- zookeeper 3.4.6启动流程粗略梳理
zookeeper 3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" " ...
- IPsec传输模式下ESP报文的装包和拆包过程
原创文章,拒绝转载 装包过程 总体流程图 过程描述 在原IP报文中找到TCP报文部分,在其后添加相应的ESP trailer信息. ESP trailer 包含三部分:Padding,Pad leng ...
- Hadoop2.5.2+HA+zookeeper3.4.6详细配置过程
心血之作,在熟悉hadoop2架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间.最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠.这篇文章中,我也 ...
随机推荐
- pyopenssl
https://pyopenssl.readthedocs.org/en/stable/ pyopenssl是一个封装了openssl的python模块. 使用它可以方便地进行一些加解密操作. 1.产 ...
- Truck History--poj1789
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21534 Accepted: 8379 De ...
- Nasty Hacks <入门练手题>
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- ASP.NET学习笔记——ASP.NET应用程序
0 剖析ASP.NET应用程序 用户运行ASP.NET应用程序,不是直接运行,而是使用浏览器(比如IE)通过HTTP请求一个特定的URL(如http://www.mysite.com/mypage.a ...
- 观《Terminal》之感
读书笔记系列链接地址http://www.cnblogs.com/shoufengwei/p/5714661.html. 经人推荐,用了几天时间欣赏了这部斯皮尔伯格导演的电影<Te ...
- 前端面试题之js篇
前端面试也可为是鱼龙混杂,各公司面试题的种类也大不相同,有的公司注重基础语法,面试题偏于ES,有的公司偏于页面逻辑,会考差一些js的应用,现将遇到过的题和典型的题整理一下. 1. 0.2-0.1 == ...
- PHP中$_GET['name']与$_POST['name']变量直接用变量名$name的php配置
php中,可以直接使用参数名称作为变量来接收get或post的传参,条件是php.ini中register_global设置成On 另外一种方法: if(!ini_get('register_glob ...
- 车的UML图
车的UML图,涉及到集合与泛化的东东. UML统一建模语言,通过图能够很好的分析问题.
- 如何判断是REQUEST请求是来自移动终端还是来自PC端
public bool IsMoblie() { string agent = (Request.UserAgent + "").ToLower ...
- ie6下a标签的onclick事件不执行问题解决方案
<a href="javascript:void(0)" onclick="loadiframe()">点我咯</a> <scri ...