SearchHandler.handleRequestBody(): solr搜索主流程 1.调用:RequestHandlerBase |--handleRequest(req, rsp); 2.源码分析: |-prepare() |前期的请求参数准备工作,QueryComponent可以在schemal文件中设置,易扩展 |-- SearchComponent c : components |--queryComponent.prepare() |--FQ,FL,SHARDS,Q.SHARDS.ROWS,SHARDS.START |设置查询的条件,包括分片的查询条件 |--设置fieldFlags返回的field值 |--设置defType值 |默认lucene,实际指向的是lucenePlugin,可在schema文件中扩展 |--解析QueryParser |对queryString进行解析 |--解析fq过滤值,生成filter过滤query集 |--设定shards分片信息 |--statComponent.prepare() |--debugComponent.prepare() |--process() |单组无shard情况处理 |--String ids = params.get(ShardParams.IDS); |获取shardDoc的id集合,不为空往下执行 |--通过ids获取文档id的集合,并为下一步获取DocList做准备 |--int id = req.getSearcher().getFirstMatch( |--new Term(idField.getName(), idField.getType().toInternal(idArr.get(i)))); |-- luceneIds[docs++] = id; |-- res.docList = new DocSlice(0, docs, luceneIds, null, docs, 0); |--if (rb.isNeedDocSet()) 存在DocSet需求 |--queries.add(rb.getQuery()); |queryString的查询条件 |--queries.addAll(filters); |filter查询条件 |--res.docSet = searcher.getDocSet(queries); |通过queries条件进行DocSet查询 |--rb.setResults(res); |设置结果返回值 |--rsp.add("response",rb.getResults().docList); |--return; |获取结果集后返回 |--SolrIndexSearcher.QueryCommand cmd = rb.getQueryCommand(); |获取查询封装的QueryCommand对象 |--searcher.search(result,cmd); |--getDocListC(qr,cmd); |--rb.setResult( result ); |与上同 |--rsp.add("response",rb.getResults().docLis
Solr查询过程源码分析
最新推荐文章于 2023-12-31 01:07:57 发布
本文深入剖析了Solr的搜索处理流程,从SearchHandler的handleRequestBody方法开始,详细介绍了参数准备、QueryComponent的prepare阶段,包括设置查询条件、解析QueryParser、构建filter集、处理分片信息等。接着讲解了单组和多组shard情况下处理过程,涉及到DocSet的获取、排序字段的处理以及分布式处理。最后阐述了如何通过QueryCommand进行查找并利用缓存优化查询性能。
摘要由CSDN通过智能技术生成