当前位置: 首页 > 面试题库 >

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

子车煌
2023-03-14
问题内容

在阅读“ 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的查询)。

乌韦



 类似资料:
  • 问题内容: 我一直认为Python的优势在于代码的可读性和开发速度,但是时间和内存的使用却不如C ++。 这些统计数据让我非常震惊。 您的经验告诉您关于Python与C ++的时间和内存使用情况? 问题答案: 我认为您错误地读取了这些统计信息。他们表明,Python比C ++ 慢 大约400倍,除了一个案例,Python更像是一种内存消耗。不过,就源代码大小而言,Python胜出。 我的Pytho

  • 问题内容: 阅读此内容后,引人注目: BSON还被设计为快速编码和解码。例如,整数存储为32(或64)位整数,因此不需要在文本之间进行解析。对于小整数,此方​​法比JSON使用更多的空间, 但解析速度要快得多 。 根据我的阅读,使用BSON的全部目的是因为它对CPU的负担更少,并且编码/处理速度更快。 但是,我对Node.js进行了一些测试,并使用本机JSON方法使BSON脱颖而出。一些测试表明J

  • 本文向大家介绍Event filter with query SELECT * FROM __InstanceModificationEvent WITHIN,包括了Event filter with query SELECT * FROM __InstanceModificationEvent WITHIN的使用技巧和注意事项,需要的朋友参考一下 问题描述: Details -Event fil

  • 问题内容: 我有一个包含10列的表格,在该表格中,我有成千上万的行。在某些情况下,我想一次更新超过1万条记录。目前,我的方案代码按顺序运行, 我以为不是将相同的查询运行10K次,而是将所有ID添加到字符串中,然后运行一个更新查询,例如, 实际的数据库查询可能是这样的, 假设我有主键ID,例如 所以在第一种情况下,我的查询将像 我的批量更新查询将像 所以我的问题是,通过批量更新可以提高性能(执行时间

  • 今天我做了一个简单的测试来比较Java和c之间的速度--一个简单的循环,让一个整数“I”从0增加到20亿。 我真的期望C语言比Java更快。我对结果感到惊讶: Java所用的时间(秒):大约。1.8秒 C:大约用秒表示的时间。3.6秒。 我不认为Java是一种更快的语言,但我也不明白为什么在我的简单程序中循环的速度是c的两倍? 我是不是在计划中犯了重大错误?还是MinGW的编译器配置不好还是怎么的

  • 问题内容: 我是elasticsearch的新手,在must和filter之间感到困惑。我想在条款之间执行and操作,所以我这样做了 开机自检/ xyz / _search 这给了我所需的结果,既匹配了术语,又使用了像这样的过滤器 开机自检/ xyz / _search 我得到相同的结果,所以什么时候应该使用must以及什么时候应该使用filter?有什么区别? 问题答案: 有助于得分。在中,查询