设为首页 收藏本站
查看: 1619|回复: 0

[经验分享] solr 查询解析流程

[复制链接]

尚未签到

发表于 2015-7-17 11:28:24 | 显示全部楼层 |阅读模式
  转载 http://13shu.iteye.com/blog/743825

  1、请求被solr的过滤器拦截转发到RequestHandlerBase中的handleRequest()
  2、handleRequest()中调用handleRequestBody()(抽象的)
  根据请求参数qt=standard查找solrconfig.xml配置文件(SolrConfig初始化)中找到SearchHandler类



Xml代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%09%3CrequestHandler%20name%3D%22standard%22%20class%3D%22solr.SearchHandler%22%0A%09%09default%3D%22true%22%3E%0A%09%09%3C!--%20default%20values%20for%20query%20parameters%20--%3E%0A%09%09%3Clst%20name%3D%22defaults%22%3E%0A%09%09%09%3Cstr%20name%3D%22echoParams%22%3Eexplicit%3C%2Fstr%3E%0A%09%09%09%3C!--%0A%09%09%09%09%3Cint%20name%3D%22rows%22%3E10%3C%2Fint%3E%0A%09%09%09%09%3Cstr%20name%3D%22fl%22%3E*%3C%2Fstr%3E%0A%09%09%09%09%3Cstr%20name%3D%22version%22%3E2.1%3C%2Fstr%3E%0A%09%09%09--%3E%0A%09%09%3C%2Flst%3E%0A%09%3C%2FrequestHandler%3E DSC0000.png


  •    
  •    
  •         explicit
  •         
  •    

  3、调用SearchHandler中handleRequestBody()去遍历查询组件集合



Java代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%20%20%20%20%20%20for(%20SearchComponent%20c%20%3A%20components%20)%20%7B%0A%20%20%20%20%20%20%20%20c.prepare(rb)%3B%0A%20%20%20%20%20%20%7D

  • for( SearchComponent c : components ) {
  •   c.prepare(rb);
  • }
  
  4、以QueryComponent为例执行prepare(),根据defType参数得到QParser(默认=lucene)



Java代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=QParser%20parser%20%3D%20QParser.getParser(rb.getQueryString()%2C%20defType%2C%20req)%3B

  • QParser parser = QParser.getParser(rb.getQueryString(), defType, req);
  5、通过defType参数获得QParserPlugin



Java代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%20%20public%20static%20QParser%20getParser(String%20qstr%2C%20String%20defaultType%2C%20SolrQueryRequest%20req)%20throws%20ParseException%20%7B%0A%20%20%20%20SolrParams%20localParams%20%3D%20QueryParsing.getLocalParams(qstr%2C%20req.getParams())%3B%0A%20%20%20%20String%20type%3B%0A%20%20%20%20%0A%20%20%20%20if%20(localParams%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20type%20%3D%20defaultType%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20String%20localType%20%3D%20localParams.get(QueryParsing.TYPE)%3B%0A%20%20%20%20%20%20type%20%3D%20localType%20%3D%3D%20null%20%3F%20defaultType%20%3A%20localType%3B%0A%20%20%20%20%20%20qstr%20%3D%20localParams.get(%22v%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20type%20%3D%20type%3D%3Dnull%20%3F%20QParserPlugin.DEFAULT_QTYPE%20%3A%20type%3B%0A%0A%20%20%20%20%3Cspan%20style%3D%22color%3A%20%23ff0000%3B%22%3EQParserPlugin%20qplug%20%3D%20req.getCore().getQueryPlugin(type)%3B%3C%2Fspan%3E%0A%20%20%20%20return%20qplug.createParser(qstr%2C%20localParams%2C%20req.getParams()%2C%20req)%3B%0A%20%20%7D

  • public static QParser getParser(String qstr, String defaultType, SolrQueryRequest req) throws ParseException {
  •   SolrParams localParams = QueryParsing.getLocalParams(qstr, req.getParams());
  •   String type;

  •   if (localParams == null) {
  •     type = defaultType;
  •   } else {
  •     String localType = localParams.get(QueryParsing.TYPE);
  •     type = localType == null ? defaultType : localType;
  •     qstr = localParams.get("v");
  •   }

  •   type = type==null ? QParserPlugin.DEFAULT_QTYPE : type;

  •   QParserPlugin qplug = req.getCore().getQueryPlugin(type);
  •   return qplug.createParser(qstr, localParams, req.getParams(), req);
  • }
  6、QueryComponent中调用解析



Java代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=QParser%20parser%20%3D%20QParser.getParser(rb.getQueryString()%2C%20defType%2C%20req)%3B%0A%20%20%20%20%20%20rb.setQuery(%20%3Cspan%20style%3D%22color%3A%20%23ff0000%3B%22%3Eparser.getQuery()%3C%2Fspan%3E%20)%3B

  • QParser parser = QParser.getParser(rb.getQueryString(), defType, req);
  •       rb.setQuery( parser.getQuery() );
  7、解析完成返回



Java代码 http://13shu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf?clipboard=%20%20public%20Query%20parse()%20throws%20ParseException%20%7B%0A%20%20%20%20String%20qstr%20%3D%20getString()%3B%0A%0A%20%20%20%20String%20defaultField%20%3D%20getParam(CommonParams.DF)%3B%0A%20%20%20%20if%20(defaultField%3D%3Dnull)%20%7B%0A%20%20%20%20%20%20defaultField%20%3D%20getReq().getSchema().getDefaultSearchFieldName()%3B%0A%20%20%20%20%7D%0A%20%20%20%20lparser%20%3D%20new%20SolrQueryParser(this%2C%20defaultField)%3B%0A%0A%20%20%20%20%2F%2F%20these%20could%20either%20be%20checked%20%26%20set%20here%2C%20or%20in%20the%20SolrQueryParser%20constructor%0A%20%20%20%20String%20opParam%20%3D%20getParam(QueryParsing.OP)%3B%0A%20%20%20%20if%20(opParam%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20lparser.setDefaultOperator(%22AND%22.equals(opParam)%20%3F%20QueryParser.Operator.AND%20%3A%20QueryParser.Operator.OR)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%2F%2F%20try%20to%20get%20default%20operator%20from%20schema%0A%20%20%20%20%20%20QueryParser.Operator%20operator%20%3D%20getReq().getSchema().getSolrQueryParser(null).getDefaultOperator()%3B%0A%20%20%20%20%20%20lparser.setDefaultOperator(null%20%3D%3D%20operator%20%3F%20QueryParser.Operator.OR%20%3A%20operator)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20lparser.parse(qstr)%3B%0A%20%20%7D

  • public Query parse() throws ParseException {
  •   String qstr = getString();

  •   String defaultField = getParam(CommonParams.DF);
  •   if (defaultField==null) {
  •     defaultField = getReq().getSchema().getDefaultSearchFieldName();
  •   }
  •   lparser = new SolrQueryParser(this, defaultField);

  •   // these could either be checked & set here, or in the SolrQueryParser constructor
  •   String opParam = getParam(QueryParsing.OP);
  •   if (opParam != null) {
  •     lparser.setDefaultOperator("AND".equals(opParam) ? QueryParser.Operator.AND : QueryParser.Operator.OR);
  •   } else {
  •     // try to get default operator from schema
  •     QueryParser.Operator operator = getReq().getSchema().getSolrQueryParser(null).getDefaultOperator();
  •     lparser.setDefaultOperator(null == operator ? QueryParser.Operator.OR : operator);
  •   }

  •   return lparser.parse(qstr);
  • }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87622-1-1.html 上篇帖子: [ solr入门 ] 下篇帖子: constellio——基于solr的开源搜索引擎系统源码研究(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表