在上一篇文章的结尾,我们总结了使用NumericDocValues优化查询TopN的原理:假设查询TopN的排序规则为按照正排值从小大小的顺序,即正排值越小,优先级越高。故在开启优化后,当收集器收到一个文档号,先根据文档号从正排索引中拿到正排值,在满足某些条件后,根据正排值,通过查询BKD树获取所有小于该正排值的文档集合,该文档集合用于生成一个新的迭代器。随后每次传入到收集器的文档号将会从新的迭代器中获取,达到所谓的skip non-competitive documents的效果。
上文的描述中,我们需要对两个问题进一步展开介绍:
- 问题一:满足什么条件后会生成一个新的迭代器
- 问题二:如何生成一个新的迭代器
问题一:满足什么条件后会生成一个新的迭代器
满足的条件很苛刻,本文中只挑选出部分条件,且这些条件必须同时满足。完整的内容可以阅读源码:NumericComparator类中的updateCompetitiveIterator()