Solr源码解析之一 -- 查询解析器QueryParser

x33g5p2x  于2021-12-20 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(540)
  • 查询解析器注册
  • 查询解析

查询解析器注册

(1)SolrCore构造函数中调用QParserPlugin的init方法注册各种Parser插件

  1. qParserPlugins.init(createInstances(QParserPlugin.standardPlugins), this);

(2)QParserPlugin中调用绑定Parser名字和实例

  1. public abstract class QParserPlugin implements NamedListInitializedPlugin, SolrInfoMBean {
  2. public static final Map<String, Class<? extends QParserPlugin>> standardPlugins;
  3. static {
  4. HashMap<String, Class<? extends QParserPlugin>> map = new HashMap<>(30, 1);
  5. map.put(LuceneQParserPlugin.NAME, LuceneQParserPlugin.class);
  6. map.put(OldLuceneQParserPlugin.NAME, OldLuceneQParserPlugin.class);
  7. map.put(FunctionQParserPlugin.NAME, FunctionQParserPlugin.class);
  8. map.put(PrefixQParserPlugin.NAME, PrefixQParserPlugin.class);
  9. map.put(BoostQParserPlugin.NAME, BoostQParserPlugin.class);
  10. map.put(DisMaxQParserPlugin.NAME, DisMaxQParserPlugin.class);
  11. map.put(ExtendedDismaxQParserPlugin.NAME, ExtendedDismaxQParserPlugin.class);
  12. map.put(FieldQParserPlugin.NAME, FieldQParserPlugin.class);
  13. map.put(SimpleQParserPlugin.NAME, SimpleQParserPlugin.class);
  14. map.put(ComplexPhraseQParserPlugin.NAME, ComplexPhraseQParserPlugin.class);
  15. ......
  16. standardPlugins = Collections.unmodifiableMap(map);
  17. }
  18. }

查询解析

(1)在组件QueryComponent的prepare()方法中,根据查询语句确定查询解析器:

  1. public class QueryComponent extends SearchComponent {
  2. public static final String COMPONENT_NAME = "query";
  3. public void prepare(ResponseBuilder rb) throws IOException
  4. {
  5. '''省略...'''
  6. '''获取默认的parser'''
  7. String defType = params.get(QueryParsing.DEFTYPE, QParserPlugin.DEFAULT_QTYPE);
  8. try {
  9. '''调用QParser的getParser方法'''
  10. QParser parser = QParser.getParser(rb.getQueryString(), defType, req);
  11. '''调用查询解析器解析查询,返回Lucene的Query子类对象'''
  12. Query q = parser.getQuery();
  13. if (q == null) {
  14. // normalize a null query to a query that matches nothing
  15. q = new MatchNoDocsQuery();
  16. }
  17. '''省略.....'''
  18. }
  19. }

(2)QParser的getParser方法

  1. public static QParser getParser(String qstr, String defaultParser, SolrQueryRequest req) throws SyntaxError {
  2. ......
  3. String parserName;
  4. if (localParams == null) {
  5. parserName = defaultParser;
  6. } else {
  7. parserName = localParams.get(QueryParsing.TYPE,defaultParser);
  8. qstr = localParams.get("v");
  9. }
  10. parserName = parserName==null ? QParserPlugin.DEFAULT_QTYPE : parserName;
  11. '''根据名字在map中查询初始化时注册的解析器插件'''
  12. QParserPlugin qplug = req.getCore().getQueryPlugin(parserName);
  13. '''创建具体的解析器'''
  14. QParser parser = qplug.createParser(qstr, localParams, req.getParams(), req);
  15. parser.stringIncludingLocalParams = stringIncludingLocalParams;
  16. parser.valFollowedParams = valFollowedParams;
  17. parser.localParamsEnd = localParamsEnd;
  18. return parser;
  19. }

(3)QParser的getQuery方法解析query并返回Lucene的Query类对象

  1. public abstract class QParser {
  2. '''在此,只有第一次调用时才解析,然后会缓存解析结果以备后用'''
  3. public Query getQuery() throws SyntaxError {
  4. if (query==null) {
  5. '''调用parse()返回Query对象'''
  6. query=parse();
  7. if (localParams != null) {
  8. String cacheStr = localParams.get(CommonParams.CACHE);
  9. if (cacheStr != null) {
  10. if (CommonParams.FALSE.equals(cacheStr)) {
  11. extendedQuery().setCache(false);
  12. } else if (CommonParams.TRUE.equals(cacheStr)) {
  13. '''缓存Query'''
  14. extendedQuery().setCache(true);
  15. } else if ("sep".equals(cacheStr)) {
  16. extendedQuery().setCacheSep(true);
  17. }
  18. }
  19. int cost = localParams.getInt(CommonParams.COST, Integer.MIN_VALUE);
  20. if (cost != Integer.MIN_VALUE) {
  21. extendedQuery().setCost(cost);
  22. }
  23. }
  24. }
  25. return query;
  26. }
  27. }

相关文章