首先来看lucene检索执行时序图:
我们现在开始:
我们经常有这样的疑问——filters之间执行的顺序是怎么样的,以及filter查询是在query查询之前还是之后,等等这些问题。这确实是非常重要的问题:诀窍就在于执行一个 query时优先处理 cheap bits(代价更小的比如较短的 posting list)。也许你可能在过去听说或看过 filter查询的执行优先于 query,因为大家都觉得我们不对不匹配过滤器的文档计算分数。但实际情况要复杂一些。
同样,该问题的措词表明我们要遍历所有文档,并检查 query/filter是否一一匹配,而事实则更加微妙:我们的索引结构可以帮助有效地跳过可能不匹配的文档。
查询/过滤器如何运行? 在解释查询如何工作之前,我无法让您深入了解查询的执行顺序。 查询和过滤器具备着以下操作:
cost():查询/过滤器匹配多少文档的近似值。 docID():当前文档ID,初始化为-1。 advance(target):查找可能匹配的目标之后的第一个文档。(skipList操作) nextDoc(): 查找可能匹配的下一个(按文档ID顺序)文档。 这是Advance(docID(