【发布时间】:2014-02-22 19:13:11
【问题描述】:
我有一个大约 9 Mio 的 Lucene 索引。文档,它们使用BooleanQuery 查询,该TermQueries 组合了几个TermQueries(组合为AND)。很基础。我的搜索通常会产生大约 10 个文档的结果,但在极少数情况下可能会发生,我得到的结果要多得多。我正在做的事情是这样的:
TopDocs searchResult = searcher.search(query, MAX_RESULT_COUNT);
for (int i = 0; i < searchResult.scoreDocs.length; i++) {
Document document = searcher.doc(searchResult.scoreDocs[i].doc);
// read data from index fields and create result instances here
}
出于我的天真,我最初将MAX_RESULT_COUNT 设置为Integer.MAX_VALUE,因为我认为,如果搜索通常只得到10 个结果,那么最大值无关紧要,而且无论如何也不会达到该值。大错特错。正如我发现的那样,搜索速度更快,我设置的MAX_RESULT_COUNT 越低。
现在,如前所述,我可以设置一个相对较低的值(例如 100)以获得最佳搜索性能。但在极少数情况下,可能会有更多结果,我也必须抓住。
有人可以向我解释一下,为什么这个值对搜索速度有如此大的影响,虽然实际可用结果的数量要少很多?是否有一种优雅的方式来获取所有可用结果并仍然获得尽可能高的性能?
【问题讨论】:
标签: java performance lucene