介绍
今天记录一下Lucene的搜索过程,基于自己的理解吧。
概要
- 获取词典及词典的文档号倒排表
- 解析Query语句,转为一棵Query查询树
- 根据Query构建Weight,用于计算查询权重并构建查询评分器,主要调用IndexSearcher.createWeight(),实际是由Query.createWeight()生成,在不需要评分或在缓存的时候,会添加到缓存。
- 构建Scorer,用于对文档集进行评分,主要调用weight.bulkScorer(ctx);
- 对文档进行评分 主要调用 scorer.score(leafCollector, ctx.reader().getLiveDocs());
- 结果集在Collector中,最终返回结果
记录
- 自己写的新的Query需要重写createWeight(),以便生成相应的Weight
- Weight中需要重写scorer()等重要的方法,用于进行评分
- scorer主要重写 matches()和matchCost()
总的来说Lucene以及帮我们做了大部分工作,根据自己的需要就可以自定义一些查询。比如Elasticsearch的ScriptQuery就是重写了一个createWeight(),scorer()方法返回了一个ConstantScoreWeight。
网友评论