在阅读"Lucene in Action 2nd edition"时,我遇到了Filter
可用于Lucene中的结果过滤的类的描述.Lucene有很多重复Query
类的过滤器.例如,NumericRangeQuery
和NumericRangeFilter
.
这本书说NRF
完全相同,NRQ
但没有文件评分.这是否意味着,如果我不需要得分或排序文件文档字段的值,我应该更喜欢Filter
荷兰国际集团在Query
从性能的角度来看荷兰国际集团?
Den*_*nov 12
我从Uwe Schindler那里得到了一个很好的答案,让我在这里重新发布.
如果你不缓存过滤器,查询会更快,因为Lucene中的ConjunctionScorer有优化,目前不用于过滤器.如果缓存它们,过滤器就可以了(例如,如果对于应用于所有查询的特定用户,您始终具有相同的访问限制).在这种情况下,Filter仅执行一次并缓存所有其他请求,然后与查询结果集相交.
如果您只想例如随机"过滤"例如通过地理搜索中的可变数值范围(如边界框),使用查询,查询在大多数情况下更快(例如,范围查询和类似的东西 - 称为MultiTermQueries - 在内部也由像过滤器一样的BitSet算法 - 实际上它们只是由Scorer-impl包装的过滤器.但是将查询和你的"过滤器"查询加在一起的记分器(ConjunctionScorer)通常比搜索后应用过滤器的代码更快.这可能会有一些改进,但一般情况下过滤器在Lucene中是不再需要的,因此已经有一些方法可以使过滤器和查询相同,而是能够缓存非评分查询.这将使许多代码更容易.
过滤器可以带来Lucene 4.0的巨大速度提升,如果它们插入到IndexReader上以在评分之前过滤文档,但尚未实现(请参阅 https://issues.apache.org/jira/browse/LUCENE-3212) - 我正在做.我们也可以使过滤器随机访问(它很容易,因为它们是位集),这也可以改善后查询过滤.但是,如果他们可以支持它(例如仅基于FieldCache的查询),我还会使查询部分随机访问.
乌韦
与Dennis的回答相反:不,您可能不想使用过滤器,除非您要多次重复使用相同的查询.
A NumericRangeFilter
只是它的一个子类MultiTermQueryWrapperFilter
,这意味着它本质上是这样的:
for each document in index:
if document matches query:
match[i] = 1
else
match[i] = 0
Run Code Online (Sandbox Code Playgroud)
因此它将在索引上以线性时间运行,而不是像普通查询那样在对数时间内运行.
此外,过滤器将占用更多内存(索引中每个文档一位).
如果你要一遍又一遍地使用同一个查询,那么你可能需要付出一次性能/内存命中并让以后的用法更快.但如果这是一次性查询,那几乎肯定不值得.
(另外,如果您要重复使用它,请使用CachingWrapperFilter
以便缓存过滤器.)
归档时间: |
|
查看次数: |
8578 次 |
最近记录: |