在我的应用程序中,我使用Lucene(4.8)作为搜索引擎。
我使用IndexSearcher来确定 10 docIds,然后从我的数据库加载完整的 10 文档。在使用以下方法时,我的问题是: n 应该有多大?
search(Query query, Filter filter, int n, Sort sort)
该应用程序还支持分页,因此理论上 n 可以是 Integer.MAX_VALUE ,并且在搜索之后我确定了我想要的 10 docIds,所以在......
但这是一个好方法吗?
我的意思是,如果有可能指定偏移量,我可以在此步骤中进行分页,并在获得 10 docs后结束搜索过程。
最后:只搜索10而不是Integer.MAX_VALUE文档会是一次大规模的加速吗?
P.S。我不能自己测试最后一个问题,因为我的数据库看起来没什么大不同......但是当它生存时它会更大。
答案 0 :(得分:2)
首先,即使您指定Integer.MAX_VALUE
,它也会向下舍入到最大文档ID - 在最大绝对限制之上搜索没有任何意义。
关于加速 - 没有人会给出精确的答案,因为每个索引都不同。但是有一些共同点。
Object[size]
分配给结果(org.apache.lucene.util.PriorityQueue:64
- 这是Lucene版本4.9.0,行号可能因版本而异)org.apache.lucene.search.IndexSearcher:467
还有另一个分配,其中ScoreDoc
数组初始化为(相同的?)数字。即使初始化每个搜索结果都很便宜,但对于大型索引,它会加起来。这些大块的垃圾收集也要付出代价。想象一下,如果您每秒运行10次搜索,并获得1M搜索结果。这对GC来说很重要!因此,如果您可以采取措施来修剪搜索结果 - 请执行此操作。
然而,上述建议(以及任何其他建议)仅在您的上下文之外才有意义。测量,不要猜!修剪是一种优化,可以留待以后 - 如果你能负担得起的话。
答案 1 :(得分:1)
您不希望返回每页10的所有匹配。
您可以使用searchAfter
方法(请参阅here),这更适合您的搜索。