我同意 Jaimie 解释的解决方案。但我想指出您必须注意的另一个方面,它有助于理解搜索引擎的一般机制。
使用 TopDocCollector,您可以定义在按分数或其他排序标准对结果进行排序之前,您希望收集多少匹配您的搜索查询的命中。
请参见以下示例:
collector = TopScoreDocCollector.create(9999, true);
searcher.search(parser.parse("Clone Warrior"), collector);
// get first page
topDocs = collector.topDocs(0, 10);
int resultSize=topDocs.scoreDocs.length; // 10 or less
int totalHits=topDocs.totalHits; // 9999 or less
我们在这里告诉 Lucene 最多收集 9999 个包含搜索短语“Clone Warrior”的文档。这意味着,如果索引包含超过 9999 个包含此搜索短语的文档,则收集器将在 9999 个命中填满后停止!
这意味着,您选择的 MAX_RESULTS 越大,您的搜索结果就越好。但这仅在您期望有大量点击时才有意义。另一方面,如果您搜索“luke skywalker”并且您预计只有一次命中,那么 MAX_RESULTS 也可以设置为 1。
因此,更改 MAX_RESULTS 会影响返回的 scoreDocs,因为将对收集的命中执行排序。实际上,将 MAX_RESULTS 设置为足够大的大小,以便人类用户不会争辩错过特定文档。这个概念与 SQL 数据库的行为完全相反,它总是考虑完整的数据池。
但是lucene也支持另一种机制。您可以不为收集器定义 MAX_RESULTS,而是定义您希望等待结果集的时间量。因此,例如,您可以定义始终希望在 300 毫秒后停止收集器。这是保护您的应用程序的性能问题的好方法。但是,如果要确保计算所有相关文档,则必须将 MAX_RESULTS 参数或最大等待时间设置为无限值。