• solr 查询解析流程


    转载 http://13shu.iteye.com/blog/743825 
     

    1、请求被solr的过滤器拦截转发到RequestHandlerBase中的handleRequest()

    2、handleRequest()中调用handleRequestBody()(抽象的)

    根据请求参数qt=standard查找solrconfig.xml配置文件(SolrConfig初始化)中找到SearchHandler类

    Xml代码  收藏代码
    1. <requestHandler name="standard" class="solr.SearchHandler"  
    2.     default="true">  
    3.     <!-- default values for query parameters -->  
    4.     <lst name="defaults">  
    5.         <str name="echoParams">explicit</str>  
    6.         <!--  
    7.             <int name="rows">10</int>  
    8.             <str name="fl">*</str>  
    9.             <str name="version">2.1</str>  
    10.         -->  
    11.     </lst>  
    12. </requestHandler>  

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

    Java代码  收藏代码
    1. for( SearchComponent c : components ) {  
    2.   c.prepare(rb);  
    3. }  

     

    4、以QueryComponent为例执行prepare(),根据defType参数得到QParser(默认=lucene)

    Java代码  收藏代码
    1. QParser parser = QParser.getParser(rb.getQueryString(), defType, req);  

    5、通过defType参数获得QParserPlugin

    Java代码  收藏代码
    1. public static QParser getParser(String qstr, String defaultType, SolrQueryRequest req) throws ParseException {  
    2.   SolrParams localParams = QueryParsing.getLocalParams(qstr, req.getParams());  
    3.   String type;  
    4.     
    5.   if (localParams == null) {  
    6.     type = defaultType;  
    7.   } else {  
    8.     String localType = localParams.get(QueryParsing.TYPE);  
    9.     type = localType == null ? defaultType : localType;  
    10.     qstr = localParams.get("v");  
    11.   }  
    12.   
    13.   type = type==null ? QParserPlugin.DEFAULT_QTYPE : type;  
    14.   
    15.   <span style="color: #ff0000;">QParserPlugin qplug = req.getCore().getQueryPlugin(type);</span>  
    16.   return qplug.createParser(qstr, localParams, req.getParams(), req);  
    17. }  

     6、QueryComponent中调用解析

    Java代码  收藏代码
    1. QParser parser = QParser.getParser(rb.getQueryString(), defType, req);  
    2.       rb.setQuery( <span style="color: #ff0000;">parser.getQuery()</span> );  

     7、解析完成返回

    Java代码  收藏代码
    1. public Query parse() throws ParseException {  
    2.   String qstr = getString();  
    3.   
    4.   String defaultField = getParam(CommonParams.DF);  
    5.   if (defaultField==null) {  
    6.     defaultField = getReq().getSchema().getDefaultSearchFieldName();  
    7.   }  
    8.   lparser = new SolrQueryParser(this, defaultField);  
    9.   
    10.   // these could either be checked & set here, or in the SolrQueryParser constructor  
    11.   String opParam = getParam(QueryParsing.OP);  
    12.   if (opParam != null) {  
    13.     lparser.setDefaultOperator("AND".equals(opParam) ? QueryParser.Operator.AND : QueryParser.Operator.OR);  
    14.   } else {  
    15.     // try to get default operator from schema  
    16.     QueryParser.Operator operator = getReq().getSchema().getSolrQueryParser(null).getDefaultOperator();  
    17.     lparser.setDefaultOperator(null == operator ? QueryParser.Operator.OR : operator);  
    18.   }  
    19.   
    20.   return lparser.parse(qstr);  
    21. }  
  • 相关阅读:
    简单1694. 重新格式化电话号码
    非暴力破解788. 旋转数字
    竞赛01. 化学反应
    链表2. 两数相加
    日常777. 在LR字符串中交换相邻字符
    竞赛02. 销售出色区间
    竞赛03. 重复的彩灯树
    力扣做题08. 零矩阵
    python3 安装 impyla
    git clone 指定分支
  • 原文地址:https://www.cnblogs.com/chenying99/p/2613544.html
Copyright © 2020-2023  润新知