可能大家都知道,lucene采用了传统搜索引擎中倒排表的数据结构.在搜索时,假设我们要查询"+(a:test)+(b:test1)"的话,首先要先查询得到a字段中包含 test关键字的倒排表,然后查询得到b字段中包含test1关键字的倒排表,然后对两个倒排表结构进行merge操作:计算两者间的交集就是我们的查询结果.
当然这只是其中一个例子罢了.实际情况中,因为查询条件不同和复杂性,我们可能会遇到更 多对倒排表的操作:交集,并集,差集等.本文主要讲述lucene如何对交集进行处理:合并倒排表,生成SumScorer结果.
第一步:过滤筛选:
先对每个倒排表进行检查:每个倒排表都是一个DocIdSetIterator,如果其中一个倒排表中list为空,则说明交集肯定为空,不需要进行接下来的工作:
时间复杂度为O(N)常量级别
第二步:对倒排表数组进行排序:效果是倒排表数组按照每个倒排表第一个docid进行升级排序:
第三步:删减无用docid:因为是对多个倒排表求交集,所以需要先筛选去掉倒排表中那些比较小的docid: