我对查询处理的理解是否正确?
- 从缓存中获取 DocSet 或第一个过滤器查询将创建 OpenBitSet 或 SortedVIntSet 的实现并缓存它
- 从缓存中获取 DocSet 或所有其他过滤器创建它们的 DocBitSet 实现,它将与原始代码相交(此代码的效率取决于 DocSet 的第一个实现的实现)
- 我们使用 Lucene 过滤器+查询搜索对 MainQuery 和最终 DocSet(在所有交叉点之后)进行跨越(效率取决于第一个 DocSet 实现)
- 我们应用 post filters(cost > 100 && cache==false) 作为原始查询的 AND
因此,性能将取决于第一个过滤器,因为小型查询 SortedIntSet 更有效,而大型 BitSet 更好。我对么?
问题的第二部分:DocSet 有两个主要实现 - HashDocSet 和 SortedIntDoc,每个交集实现迭代第一个过滤器中的所有实例并检查它是否也在第二个 DocSet 中......这意味着我们必须按大小对过滤器进行排序,最小的优先。是否可以控制缓存过滤器的顺序(成本仅适用于非缓存过滤器)?