2012-08-22 65 views
3

我对查询处理的理解是否正确?Solr过滤器如何实际执行?

  1. 得到缓存或第一过滤查询文档集将创建实施OpenBitSet或SortedVIntSet的,并将它缓存
  2. 获取文档集从高速缓存或所有其他过滤器创建自己的执行DocBitSet的,它会与相交原始(这段代码的效率取决于DocSet的实施第一次执行
  3. 我们使用Lucene过滤器+查询搜索(effici)使用MainQuery和最终DocSet进行跳跃(在所有交集之后)这ency是依赖于第一文档集实施
  4. 我们采用后置滤波器(成本> 100 & &缓存==假)作为一部开拓创新的查询

这样的结果表现将依赖于AND第一个筛选器因为对于小查询SortedIntSet更有效,对于大BitSet更好。 我正确吗?

问题第二部分: 文档集有两个主要的实现 - HashDocSet和SortedIntDoc,在所有情况下,每个路口实现循环在第一过滤器,并检查它也是第二文档集......这意味着我们必须排序按尺寸过滤,最小为先。 是否可以控制缓存过滤器的顺序(成本只适用于非缓存过滤器)?

回答

3

听起来不错。欲了解更多信息,请看SolrIndexSearcher#getProcessedFilter

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

这是空间效率问题比速度问题更多。甲排序INT []成本4 * nDocs字节,而位组成本maxDoc/8个字节,这是为什么Solr的用途来分类的INT []每当文件集合中的数量为< maxDoc/32

二问题的一部分:文档集有两个主要的实现 - HashDocSet和SortedIntDoc

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