queryParser,是指查询解析器,就是将输入的检索文字以固定的语法格式解析为lucene的查询器(Query)。
自定义solr的queryParser可以参考
http://blog.chenlb.com/2009/02/use-custom-solr-queryparser.html
http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html
使用时,将自定义的queryParser在solrconfig.xml中配置:
<queryParser name="myparser" class="com.mycompany.MyQParserPlugin"/>
在solr启动时分析过,在SolrConfig类实例化的时候,会读取solrconfig.xml中得属性,并存入pluginStore属性中(其是一个Map<String, List<PluginInfo>>),然后在SolrCore实例化的时候,将这些属性初始化。参见
http://blog.csdn.net/wenchanter/article/details/37603621
中initQParsers方法。
在QParserPlugin.standardPlugin中,列出了默认的QueryParser:
/**
* Internal use - name to class mappings of builtin parsers.
* Each query parser plugin extending {@link QParserPlugin} has own instance of standardPlugins.
* This leads to cyclic dependencies of static fields and to case when NAME field is not yet initialized.
* This result to NPE during initialization.
* For every plugin, listed here, NAME field has to be final and static.
*/
public static final Object[] standardPlugins = {
LuceneQParserPlugin.NAME, LuceneQParserPlugin.class,
OldLuceneQParserPlugin.NAME, OldLuceneQParserPlugin.class,
FunctionQParserPlugin.NAME, FunctionQParserPlugin.class,
PrefixQParserPlugin.NAME, PrefixQParserPlugin.class,
BoostQParserPlugin.NAME, BoostQParserPlugin.class,
DisMaxQParserPlugin.NAME, DisMaxQParserPlugin.class,
ExtendedDismaxQParserPlugin.NAME, ExtendedDismaxQParserPlugin.class,
FieldQParserPlugin.NAME, FieldQParserPlugin.class,
RawQParserPlugin.NAME, RawQParserPlugin.class,
TermQParserPlugin.NAME, TermQParserPlugin.class,
NestedQParserPlugin.NAME, NestedQParserPlugin.class,
FunctionRangeQParserPlugin.NAME, FunctionRangeQParserPlugin.class,
SpatialFilterQParserPlugin.NAME, SpatialFilterQParserPlugin.class,
SpatialBoxQParserPlugin.NAME, SpatialBoxQParserPlugin.class,
JoinQParserPlugin.NAME, JoinQParserPlugin.class,
SurroundQParserPlugin.NAME, SurroundQParserPlugin.class,
SwitchQParserPlugin.NAME, SwitchQParserPlugin.class,
MaxScoreQParserPlugin.NAME, MaxScoreQParserPlugin.class,
BlockJoinParentQParserPlugin.NAME, BlockJoinParentQParserPlugin.class,
BlockJoinChildQParserPlugin.NAME, BlockJoinChildQParserPlugin.class,
CollapsingQParserPlugin.NAME, CollapsingQParserPlugin.class,
SimpleQParserPlugin.NAME, SimpleQParserPlugin.class
};
而究竟在查询的时候使用那种QueryParser来解析,是根据查询时输入的defType或LocalParams(即{!})来确定的。
具体调用是在QueryComponent中得prepare方法中:
QParser parser =QParser.getParser(rb.getQueryString(),defType, req);
这个在solr查询过程中在详细分析。