在我的应用程序中,我使用 Lucene (4.8) 作为搜索引擎。
我使用 IndexSearcher 确定 10 个 docId,然后从数据库加载完整的 10 文档。使用以下方法时,我的问题是:n 应该有多大?
search(Query query, Filter filter, int n, Sort sort)
该应用程序还支持分页,因此理论上n可以是Integer.MAX_VALUE,并且在搜索之后我确定了我想要的10 docIds,所以于...
但是这是一个好方法吗?
我的意思是,如果有可能指定偏移量,我可以在此步骤中进行分页,并在获取 10 文档后结束搜索过程。
最后:仅搜索 10 而不是 Integer.MAX_VALUE 文档会带来巨大的加速吗?
附注我无法自己测试最后一个问题,因为我的数据库没有那么大,看不到任何差异......但当它上线时它会大得多。
最佳答案
首先,即使您指定 Integer.MAX_VALUE
,它也会向下舍入到最大文档 ID - 搜索超出最大绝对限制是没有意义的。
关于加速 - 没有人会给你准确的答案,因为每个索引都是不同的。但还是有一些共同点。
- 对于每次搜索,都会为结果分配新的
Object[size]
(org.apache.lucene.util.PriorityQueue:64
- 这是 Lucene 版本 4.9.0,行号可能因版本而异) - 在
org.apache.lucene.search.IndexSearcher:467
处还有另一个分配,其中ScoreDoc
数组使用(相同?)数字进行初始化。 - 显然,设置每个数组元素都会产生 CPU 和 I/O 成本
即使初始化每个搜索结果都很便宜,但对于大型索引来说,它会增加。此外,对这些大块进行垃圾收集是要付出代价的。想象一下,如果您每秒运行搜索 10 次,并获得 100 万个搜索结果。这对于 GC 来说是一个很大的工作量!因此,如果您可以采取一些措施来修剪搜索结果,那就去做吧。
但是,上述建议(以及任何其他建议)只有在您的上下文之外才有意义。测量,不要猜测!修剪是一种可以留待以后进行的优化——如果您负担得起的话。
关于java - 使用 Lucene 搜索有多少结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26294603/