【转载】 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 QueryResult throws 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架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间.最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠.这篇文章中,我也 ...
随机推荐
- 高效的jQuery代码编写技巧总结
最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上找的和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度 ...
- linux管理员切换与管理员密码第一次设置
在终端输入su - root回车来切回到超级管理员,Ubuntu的默认超级管理员root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo passwd,然后输入当前用 ...
- 根据identifier从StoryBoard中获取对象,UIButton的图片文件位置
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Swift UI
概述 Apple近日发布了Swift编程语言,Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言. 废话不多说,下面我就来学习使用Swift创建一个简单的UI应用 ...
- input元素有padding间距,所以使用box-sizing来保持宽度不超出父元素
http://vicbeta.com/code/2013/04/24/phone-over-width.html 手机web开发资料少,原创解决方案Mark. 手机页面遇到一个横竖屏切换时出现的问题. ...
- XJOI网上同步训练DAY3 T1
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...
- POJ 3675 Telescope
题意:给定一个不自交的多边形,要求和圆心在原点的圆的面积交. 思路:同POJ2986,是加强版 代码: #include<algorithm> #include<cstdio> ...
- Powershell变量的类型和强类型
Powershell变量的类型和强类型12 12月, 2011 在 Powershell tagged Powershell教程 / 变量 / 存储 / 数据 / 类型 by Mooser Lee ...
- mysql 增量导入到elasticsearch
<pre name="code" class="html">zjtest7-redis:/odbc_es# cat /odbc_es/run_mys ...
- uva10245-The Closest Pair Problem(平面上的点分治)
解析:平面上的点分治,先递归得到左右子区间的最小值d,再处理改区间,肯定不会考虑哪些距离已经大于d的点对,对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,x轴方向只用考虑[x-d,x+d]( ...