3

我对查询处理的理解是否正确?

  1. 从缓存中获取 DocSet 或第一个过滤器查询将创建 OpenBitSet 或 SortedVIntSet 的实现并缓存它
  2. 从缓存中获取 DocSet 或所有其他过滤器创建它们的 DocBitSet 实现,它将与原始代码相交(此代码的效率取决于 DocSet 的第一个实现的实现
  3. 我们使用 Lucene 过滤器+查询搜索对 MainQuery 和最终 DocSet(在所有交叉点之后)进行跨越(效率取决于第一个 DocSet 实现
  4. 我们应用 post filters(cost > 100 && cache==false) 作为原始查询的 AND

因此,性能将取决于第一个过滤器,因为小型查询 SortedIntSet 更有效,而大型 BitSet 更好。我对么?

问题的第二部分:DocSet 有两个主要实现 - HashDocSet 和 SortedIntDoc,每个交集实现迭代第一个过滤器中的所有实例并检查它是否也在第二个 DocSet 中......这意味着我们必须按大小对过滤器进行排序,最小的优先。是否可以控制缓存过滤器的顺序(成本仅适用于非缓存过滤器)?

4

1 回答 1

3

这听起来不错。有关更多信息,请查看SolrIndexSearcher#getProcessedFilter

因此,性能将取决于第一个过滤器,因为小型查询 SortedIntSet 更有效,而大型 BitSet 更好。我对么?

这更多的是空间效率问题而不是速度问题。排序的 int[] 花费 4 * nDocs 字节,而位集花费 maxDoc / 8 字节,这就是为什么 Solr 在集合中的文档数 < maxDoc / 32 时使用排序的 int[] 的原因。

问题的第二部分:DocSet 有两个主要实现 - HashDocSet 和 SortedIntDoc

SortedIntDocSet 的问题是它不支持随机访问,而 HashDocSet 的问题是它不能按顺序枚举文档 ID,这对于评分很重要。这就是为什么 Solr 几乎在任何地方都使用 SortedIntDocSets 并在需要随机访问时创建一个瞬态 HashDocSet(例如,查看 JoinQParserPlugin 或 DocSlice#intersect)。

于 2012-08-24T10:23:37.710 回答