1.总述 IndexSearch全过程源码分析--->生成weight树:负责的是query权重及生成score树
IndexSearch ---> search(createWeight(query), filter, n, sort)
|--createWeight(query) |实际为生成Weight树
|--return query.weight(this);
2.创建weight树总过程
query.weight(this)
|--Query query = searcher.rewrite(this); |重新解析Query,将Query生成为单个可供直接查询的Query
|--Weight weight = query.createWeight(searcher);
|--float sum = weight.sumOfSquaredWeights(); |计算sum分值
|--float norm = getSimilarity(searcher).queryNorm(sum); |获取标准因子
|--weight.normalize(norm); |标准化
|--return weight; |返回weight权值树
3.重写Query对象,生成Query树
IndexSearcher.rewrite(Query original) |重写Query对象,主要实现拆分
|--for (Query rewrittenQuery = query.rewrite(reader); rewrittenQuery != query; rewrittenQuery = query.rewrite(reader)) |重写直至不能再拆分
|--query = rewrittenQuery;
|--eg1:BooleanQuery.rewrite(reader) 实现
|--for (int i = 0 ; i < clauses.size(); i++)
lucene-搜索过程源码解析-Weight树
最新推荐文章于 2023-12-26 20:03:55 发布
本文深入剖析Lucene的搜索过程,从IndexSearcher的search方法开始,详细讲解如何通过createWeight方法生成Weight树。接着探讨Query的rewrite方法,包括BooleanQuery和MultiTermQuery的重写过程。同时,分析了sumOfSquaredWeights计算得分,queryNorm确定标准因子,以及normalize步骤的标准化处理。通过对不同Query类型的讨论,展示了 Lucene 如何构建和优化搜索权重树。
摘要由CSDN通过智能技术生成