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. }  
原文地址:https://www.cnblogs.com/chenying99/p/2613544.html