Solr源码解析之二 -- 支持Lucene查询语法变体

x33g5p2x  于2021-12-20 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(456)
  • 概述
  • 源码分析

概述

Solr除了支持通过各种查询参数查询索引外,还支持通过Lucene查询语法的变体进行查询。
例如:
{!lucene q.op=AND df=text sort=’price asc’}myfield:foo +bar -baz
该查询语句中的”foo +bar -baz”部分需要进行词法分析和语法分析。
Solr采取了与Lucene相同的词法/语法解析方法:即通过JavaCC自动生成词法/语法解析代码。关于JavaCC的知识可以参考以下两篇文章:JavaCC–Linux安装与使用和JavaCC – 生成C++代码。

源码分析

(1)注册LuceneQParserPlugin

  1. public abstract class QParserPlugin implements NamedListInitializedPlugin, SolrInfoMBean {
  2. /** internal use - name of the default parser */
  3. public static final String DEFAULT_QTYPE = LuceneQParserPlugin.NAME;
  4. static {
  5. HashMap<String, Class<? extends QParserPlugin>> map = new HashMap<>(30, 1);
  6. '''第一种类型不包含排序参数:!lucene q.op=AND df=text sort='price asc'}myfield:foo +bar -baz'''
  7. map.put(LuceneQParserPlugin.NAME, LuceneQParserPlugin.class);
  8. '''第二种类型包含排序参数:{!lucenePlusSort}myfield:foo +bar -baz;price asc'''
  9. map.put(OldLuceneQParserPlugin.NAME, OldLuceneQParserPlugin.class);
  10. .....
  11. }
  12. }

(2)创建Parser

  1. public class LuceneQParserPlugin extends QParserPlugin {
  2. public static final String NAME = "lucene";
  3. @Override
  4. public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
  5. return new LuceneQParser(qstr, localParams, params, req);
  6. }
  7. }
  8. public class LuceneQParser extends QParser {
  9. '''SolrQueryParser是JavaCC生成的QueryParser类的子类'''
  10. SolrQueryParser lparser;
  11. @Override
  12. public Query parse() throws SyntaxError {
  13. String qstr = getString();
  14. if (qstr == null || qstr.length()==0) return null;
  15. String defaultField = getParam(CommonParams.DF);
  16. if (defaultField==null) {
  17. defaultField = getReq().getSchema().getDefaultSearchFieldName();
  18. }
  19. lparser = new SolrQueryParser(this, defaultField);
  20. lparser.setDefaultOperator
  21. (QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(),
  22. getParam(QueryParsing.OP)));
  23. '''调用父类QueryParser的parse方法解析'''
  24. return lparser.parse(qstr);
  25. }
  26. }

(3)JavaCC生成的QueryParser类,Lucene也有同样的类

  1. public class QueryParser extends SolrQueryParserBase implements QueryParserConstants {
  2. '''在parse()方法调用,此函数是在JavaCC的输入文件XXX.jj中定义,并由JavaCC生成'''
  3. final public Query TopLevelQuery(String field) throws ParseException, SyntaxError {
  4. Query q;
  5. q = Query(field);
  6. jj_consume_token(0);
  7. {if (true) return q;}
  8. throw new Error("Missing return statement in function");
  9. }
  10. }

相关文章