在Lucene中,{Filter}比{Query}更快吗?


问题内容

在阅读“ Lucene in Action 2nd
Edition”时,我遇到了Filter可以在Lucene中用于结果过滤的类的描述。Lucene有很多重复Query类的过滤器。例如NumericRangeQueryNumericRangeFilter

这本书说的NRF和完全相同,NRQ但是没有文档评分。这是否意味着如果我 不需要 根据 文档字段值 对文档进行 评分
或排序,那么从性能的角度来看,我应该Filter优先Query考虑使用?


问题答案:

Uwe Schindler收到了很好的答复,让我在这里重新发布。

如果您不缓存过滤器,则查询会更快,因为Lucene中的ConjunctionScorer进行了优化,这些优化目前未用于过滤器。如果您对过滤器进行缓存(例如,如果您始终对应用于其所有查询的特定用户具有相同的访问限制),则可以使用过滤器。在这种情况下,过滤器仅执行一次,并为所有其他请求进行缓存,然后与查询结果集相交。

如果您只想例如按地理搜索中的边界框之类的变量数值范围进行“过滤”,则使用查询,在大多数情况下查询会更快(例如,范围查询和类似的东西-
MultiTermQueries在内部也可以与Filter相同的BitSet算法-实际上,它们只是由Scorer-
impl包装的Filter)。但是,将查询和您的“过滤器”查询与在一起的记分器(ConjunctionScorer)通常比搜索后应用过滤器的代码更快。这可能会有所改进,但是通常在Lucene中不再需要过滤器,因此已经有了一些使过滤器和查询相同的方法,然后可以缓存非计分查询。

如果将过滤器插入IndexReader的顶部以 评分 之前 过滤文档,则Lucene 4.0可以极大地提高速度,但这尚未实现(请参阅
https://issues.apache.org/jira/browse/LUCENE-3212)
-
我正在做。我们还可以使Filters随机访问(这很容易,因为它们是位集),这也可以改善查询后过滤。但是,如果查询可以支持的话,我也可以使其部分随机访问(例如仅基于FieldCache的查询)。

乌韦