- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Solr请求过程执行概述
Solr的请求(包括索引数据更新和查询)都是通过 SolrCore类的
execute(SolrRequestHandler handler, SolrQueryRequest req, SolrQueryResponse rsp) 方法来执行的。
其中第一个参数表示执行这一过程的处理器,这些处理器都在handler包下,例如XmlUpdateRequestHandler。
第二个参数表示请求其中包含请求的参数(通常是查询时我们 通过表单传入的参数)以及请求的内容流(例如更新索引时发送的xml格式的数据)。
第三个参数代表响应结果,handler处理请求后会将结果保存在第三个参数中。
SolrQueryRequest 接口的谱系图
其中有斜线标示的方法已经废弃
SolrQueryResponse接口的谱系图
索引更新过程
xml格式的更新数据被保存在请求的streams : IterableContentStream参数中。其中的ContentStream接口谱系图如下:
注意这里的GiantContentStream是我自己加入的类。 这个类继承自ContentStreamBase并且改写了构造函数与InputStream getStream()方法。这个方法正是更新时被处理器读取数据时调用的关键。看一看这个类的大纲也就明白了这个类的本质。
我们看到这样的代码: final NamedListObject responseHeader = new SimpleOrderedMapObject(); rsp.add(responseHeader, responseHeader); 这段代码的作用是什么呢?它是创建一个请求头的载体,然后将其加入到响应类中,这样我们就可以在响应中获得我们请求头,这个请求头中包含我们的请求参数。 关于NameList这个类,说明文件说明中说它是一个name/value对的有序表,具有如下特性:
name可以重复
name/value 对的有序
可以通过index访问
name和value都可以为空
看看它的谱系图:
再看这样一段代码: NamedList toLog = rsp.getToLog(); //toLog.add(core, getName()); toLog.add(webapp, req.getContext().get(webapp)); toLog.add(path, req.getContext().get(path)); toLog.add(params, { + req.getParamString() + }); toLog是什么呢?它是SolrQueryResponse类的一个属性,定义如下: protected NamedList toLog = new SimpleOrderedMap(); 上面我们已经看到了SimpleOrderedMap类是NamedList的子类,这里通过属性的名字不难 想象它是记录需要写入日志中的内容的 载体。的确我们在打印出来的日志中很容易找到如下内容: 信息: [database] webapp=null path=null params={} status=0 QTime=1438 执行更新关键的代码是这里: handler.handleRequest(req,rsp); setResponseHeaderValues(handler,req,rsp); 第一句执行更新过程,第二句只是将req中的参数部分以及经过处理后的rsp中的toLog中的内容写如到rsp中的请求头 (responseHeader )中来。 我们来看最关键的第一句: handler.handleRequest(req,rsp);
关于 handler.handleRequest(req,rsp)。更新常用的handler是XmlUpdateRequestHandler,所以我们 进入该类的handleRequest方法中查看究竟。我们发现XmlUpdateRequestHandler中并没有该方法,我们猜想该方法可以在父 类中,果然。于是我们就研究父类的handleRequest方法。
SolrPluginUtils.setDefaults(req,defaults,appends,invariants); 该方法内部的代码如下: SolrParams p = req.getParams(); if (defaults != nul
原创力文档


文档评论(0)