Start with org.apache.solr.handler.component.QueryComponent#prepare which
fetches the fq parameters and indirectly invokes the query parser(s):
String[] fqs = req.getParams().getParams(CommonParams.FQ);
if (fqs!=null && fqs.length!=0) {
List<Query> filters = rb.getFilters();
// if filters already exists, make a copy instead of modifying the
original
filters = filters == null ? new ArrayList<Query>(fqs.length) : new
ArrayList<Query>(filters);
for (String fq : fqs) {
if (fq != null && fq.trim().length()!=0) {
QParser fqp = QParser.getParser(fq, null, req);
filters.add(fqp.getQuery());
}
}
// only set the filters if they are not empty otherwise
// fq=&someotherParam= will trigger all docs filter for every request
// if filter cache is disabled
if (!filters.isEmpty()) {
rb.setFilters( filters );
Note that this line actually invokes the parser:
filters.add(fqp.getQuery());
Then in org.apache.lucene.search.Query.QParser#getParser:
QParserPlugin qplug = req.getCore().getQueryPlugin(parserName);
QParser parser = qplug.createParser(qstr, localParams, req.getParams(),
req);
And for the common case of the Lucene query parser,
org.apache.solr.search.LuceneQParserPlugin#createParser:
public QParser createParser(String qstr, SolrParams localParams, SolrParams
params, SolrQueryRequest req) {
return new LuceneQParser(qstr, localParams, params, req);
}
And then in org.apache.lucene.search.Query.QParser#getQuery:
public Query getQuery() throws SyntaxError {
if (query==null) {
query=parse();
And then in org.apache.lucene.search.Query.LuceneQParser#parse:
lparser = new SolrQueryParser(this, defaultField);
lparser.setDefaultOperator
(QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(),
getParam(QueryParsing.OP)));
return lparser.parse(qstr);
And then in org.apache.solr.parser.SolrQueryParserBase#parse:
Query res = TopLevelQuery(null); // pass null so we can tell later if an
explicit field was provided or not
And then in org.apache.solr.parser.QueryParser#TopLevelQuery, the parsing
begins.
And org.apache.solr.parser.QueryParser.jj is the grammar for a basic
Solr/Lucene query, and org.apache.solr.parser.QueryParser.java is generated
by JFlex, and a lot of the logic is in the base class of the generated
class, org.apache.solr.parser.SolrQueryParserBase.java.
Good luck! Happy hunting!
-- Jack Krupansky
-----Original Message-----
From: YouPeng Yang
Sent: Monday, October 21, 2013 2:57 AM
To: solr-user@lucene.apache.org
Subject: Class name of parsing the fq clause
Hi
I search the solr with fq clause,which is like:
fq=BEGINTIME:[2013-08-25T16:00:00Z TO *] AND BUSID:(M30000 OR M90000)
I am curious about the parsing process . I want to study it.
What is the Java file name describes the parsing process of the fq
clause.
Thanks
Regards.