前言
solr 通过插件的方式实现对edismax的支持。在熟悉了solr插件的执行流程后我,我们也可以对solr插件功能进行定制。实现更加强大的功能。
类图
- ExtendedDismaxQParserPlugin
- NamedListInitializedPlugin 作用
NameList作为solr存储map的方式,可以看成是一个key value容器。
NameListInitializedPlugin是可以通过NameList初始化的插件。只有一个init方法。接收NameList参数。 - SolrInfoMBean 作用
提供Solr后台基础信息的Bean接口。
3:QparserPlugin
所有插件的父类,定义了默认方法,保存声明了所有solr已经实现的plugin。
- ExtendedDismaxQparser
ExtendDismaxQparser
描述edismax支持的配置和方法,集合了edismax所需功能的各种操作。并创建 ExtendedSolrDismaxQueryParser,为其提供职责更为简明的操作环境。是edismax语法支持类。
- ExtendSolrQueryParser
- QueryBuilder
lucene 提供用于创建查询器的工厂类
可以被当做自定义解析器的子类,使得查询解析器更容易地集成到分析链中。生成查询可以定制化。
所有默认lucene提供的query在这里创建
SolrQueryParserBase
Solr继承自QueryBuilder的类。作为Solr标准查询解析器的父类。Solr对lucene的扩展,加入了 MagicFieldName RawQuery等支持。初始化时读入 schema配置。可以修改这个类来扩展schema标签功能。QueryParser
默认的query解析器SolrQueryParser
Solr’s 的默认查询解析器schema驱动的经典lucene查询解析方式。ExtendedSolrQueryParser
作为ExtendedSolrQParser的内部类存在。实施最终的查询解析。
请求过程
SolrDispatchFilter(doFilter,execute)
->SolrCore.execute
->RequestHandlerBase.handleRequest
->SearchHandler.handleRequestBody
//有可能执行多个Component
//query,facet,group等等,这里每个查询特性对应每个SearchComponent
->QueryComponent.process
->SolrIndexSearcher(search,getDocListC)
描述
edismax请求到 SearchHandler 分析调用的SearchComponent链,其中QueryComponent 通过defType选择 插件ExtendedDismaxQParserPlugin 创建queryParser初始化插件paraer
QueryComponent prepare调用
QParser rqparser = QParser.getParser(rankQueryString, defType, req);
先解析出参数语法包含的解析器信息
QueryComponent 源码部分 关键方法:
1 | public static QParser getParser(String qstr, String defaultParser, SolrQueryRequest req) throws SyntaxError { |
对edisMax查询操作,QueryComponet返回了 ExtendDismaxQparser 作为查询解析器作为后续的查询支持 。
默认解析器 lucene
扩展功能
扩展步骤:
1:新建 XXPlugin 继承 QParserPlugin
实现方法:
1 | //定义插件名称,用于配置指定 |
2:创建XXXQParser继承QParser, XXXSolrQueryParser继承SolrQueryParser
可以采用组合方式,也可以采用内部类的方式。在XXXQParser里重写 parser()方法
1 |
|
3:solrConfig里配置
1 |
|