Elasticsearch源码分析九--查询解析器QueryParser注册过程
来源:互联网 发布:软件前景 编辑:程序博客网 时间:2024/05/16 09:24
QueryParser及其子类用于对输入的查询query进行解析,返回Query类的对象,代表具体的查询类。
Elasticsearch为每种类型的Query提供了单独的查询解析器;而Lucene的QueryParser对所有类型的Query使用相同的查询解析器。
Lucene的解析器使用如下:
'''在构造QueryParser对象时传入分析器,此过程涉及JavaCC、分词器、查询语法等'''QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT));Query query = parser.parse("+(+apple* -boy) (cat* dog) -(eat~ foods)");
源码分析
'''(1)添加Query解析器及Filter解析器的实例对象'''public class IndicesQueriesModule extends AbstractModule { protected void configure() { bind(IndicesQueriesRegistry.class).asEagerSingleton(); Multibinder<QueryParser> qpBinders = Multibinder.newSetBinder(binder(), QueryParser.class); for (Class<QueryParser> queryParser : queryParsersClasses) { qpBinders.addBinding().to(queryParser).asEagerSingleton(); } for (QueryParser queryParser : queryParsers) { qpBinders.addBinding().toInstance(queryParser); }'''(1)添加Query解析器实例对象''' qpBinders.addBinding().to(MatchQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(MultiMatchQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(NestedQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(HasChildQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(HasParentQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(TopChildrenQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(DisMaxQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(IdsQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(MatchAllQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(QueryStringQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(BoostingQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(BoolQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(TermQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(TermsQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(FuzzyQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(RegexpQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(FieldQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(RangeQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(PrefixQueryParser.class).asEagerSingleton(); qpBinders.addBinding().to(WildcardQueryParser.class).asEagerSingleton();'''省略...''''''(2)添加Filter解析器实例对象''' fpBinders.addBinding().to(HasChildFilterParser.class).asEagerSingleton(); fpBinders.addBinding().to(HasParentFilterParser.class).asEagerSingleton(); '''省略...''' }}'''(2)Query/Filter类型-Query/Filter解析器实例对象对应关系注册'''public class IndexQueryParserService extends AbstractIndexComponent { '''Query类型-Query解析器实例对象映射关系''' private final Map<String, QueryParser> queryParsers; '''Filter类型-Filter解析器实例对象映射关系''' private final Map<String, FilterParser> filterParsers; public IndexQueryParserService(Index index, @IndexSettings Settings indexSettings, IndicesQueriesRegistry indicesQueriesRegistry, CacheRecycler cacheRecycler, ScriptService scriptService, AnalysisService analysisService, MapperService mapperService, IndexCache indexCache, IndexFieldDataService fieldDataService, IndexEngine indexEngine, @Nullable SimilarityService similarityService, @Nullable Map<String, QueryParserFactory> namedQueryParsers, @Nullable Map<String, FilterParserFactory> namedFilterParsers) { super(index, indexSettings); this.cacheRecycler = cacheRecycler; this.scriptService = scriptService; this.analysisService = analysisService; this.mapperService = mapperService; this.similarityService = similarityService; this.indexCache = indexCache; this.fieldDataService = fieldDataService; this.indexEngine = indexEngine; this.defaultField = indexSettings.get("index.query.default_field", AllFieldMapper.NAME); this.queryStringLenient = indexSettings.getAsBoolean("index.query_string.lenient", false); List<QueryParser> queryParsers = newArrayList(); if (namedQueryParsers != null) { Map<String, Settings> queryParserGroups = indexSettings.getGroups(IndexQueryParserService.Defaults.QUERY_PREFIX); for (Map.Entry<String, QueryParserFactory> entry : namedQueryParsers.entrySet()) { String queryParserName = entry.getKey(); QueryParserFactory queryParserFactory = entry.getValue(); Settings queryParserSettings = queryParserGroups.get(queryParserName); if (queryParserSettings == null) { queryParserSettings = EMPTY_SETTINGS; } queryParsers.add(queryParserFactory.create(queryParserName, queryParserSettings)); } } Map<String, QueryParser> queryParsersMap = newHashMap(); queryParsersMap.putAll(indicesQueriesRegistry.queryParsers()); if (queryParsers != null) { '''添加Query类型-Query解析器实例对象到Map中''' for (QueryParser queryParser : queryParsers) { add(queryParsersMap, queryParser); } } this.queryParsers = ImmutableMap.copyOf(queryParsersMap); List<FilterParser> filterParsers = newArrayList(); if (namedFilterParsers != null) { Map<String, Settings> filterParserGroups = indexSettings.getGroups(IndexQueryParserService.Defaults.FILTER_PREFIX); for (Map.Entry<String, FilterParserFactory> entry : namedFilterParsers.entrySet()) { String filterParserName = entry.getKey(); FilterParserFactory filterParserFactory = entry.getValue(); Settings filterParserSettings = filterParserGroups.get(filterParserName); if (filterParserSettings == null) { filterParserSettings = EMPTY_SETTINGS; } filterParsers.add(filterParserFactory.create(filterParserName, filterParserSettings)); } } Map<String, FilterParser> filterParsersMap = newHashMap(); filterParsersMap.putAll(indicesQueriesRegistry.filterParsers()); if (filterParsers != null) { '''添加Filter类型-Filter解析器实例对象到Map中''' for (FilterParser filterParser : filterParsers) { add(filterParsersMap, filterParser); } } this.filterParsers = ImmutableMap.copyOf(filterParsersMap); }} '''(3)提供接口根据name获取解析器实例对象'''public class IndexQueryParserService extends AbstractIndexComponent { '''根据Query名字获取Query解析器实例对象''' public QueryParser queryParser(String name) { return queryParsers.get(name); } '''根据Filter名字获取Filter解析器实例对象''' public FilterParser filterParser(String name) { return filterParsers.get(name); }}'''(4)Map的Key定义即Query类型和Filter类型来源'''public class WildcardQueryParser implements QueryParser { '''Query类型定义''' public static final String NAME = "wildcard"; @Override '''Query类型获取接口''' public String[] names() { return new String[]{NAME}; }}public class PrefixFilterParser implements FilterParser { '''Filter类型''' public static final String NAME = "prefix"; '''Filter类型获取接口''' @Override public String[] names() { return new String[]{NAME}; }}
0 0
- Elasticsearch源码分析九--查询解析器QueryParser注册过程
- Elasticsearch源码分析十一--查询分析器Analyzer注册过程
- Solr源码解析之一 -- 查询解析器QueryParser
- Elasticsearch源码分析八--如何根据查询语句确定查询类型并解析查询语句
- 查询字符串的解析—QueryParser类
- Lucene(3.5)解析查询表达式:QueryParser
- solr 自定义QueryParser 用户查询解析方案
- elasticsearch源码分析之search查询(十一)
- elasticsearch源码分析之启动过程
- Elasticsearch分词器源码解析
- Elasticsearch源码分析之二------索引过程源码概要分析
- ElasticSearch源码分析之二:索引过程源码概要分析
- elasticsearch源码分析之索引操作(九)
- Solr查询过程源码分析
- Solr查询过程源码分析
- Spring源码分析----IOC容器的实现(IoC容器的初始化过程(定位、载入解析、注册))
- Android源码解析之动态注册广播接收器的过程分析
- Android请求注册服务过程源码分析
- 【转】iOS UIButton(UIEdgeInsets)
- Android学习笔记 3.3View的弹性滑动
- 棋盘分割
- httpclient4.3发送post和get实例代码
- html中META标签的作用及SEO关键字优化办法
- Elasticsearch源码分析九--查询解析器QueryParser注册过程
- Jquery 多选下拉框取值
- 基于HTK的连续语音识别系统搭建学习笔记(一)
- Oracle 增加修改删除字段
- 趣学 C 语言 (一)—— time.h
- 详解Oracle DELETE和TRUNCATE 的区别
- Spring的PropertyPlaceholderConfigurer应用
- jQuery参数传递赋值的问题
- FreeMarker and Spring MVC