我同意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個文件。這意味着,如果索引包含超過9999個包含該搜索短語的文檔,收集器將在填充9999個匹配後停止!
這意味着,您選擇MAX_RESULTS的次數越多,您的搜索結果越好。但是這隻有在你期望有大量的點擊時纔有意義。 另一方面,如果您搜索「luke skywalker」並且您只會期待一次命中,那麼MAX_RESULTS也可以設置爲1.
因此,更改MAX_RESULTS會影響返回的scoreDocs,因爲將執行排序在收集的點擊。實際上,將MAX_RESULTS設置爲足夠大的大小,以便人類用戶不會錯過錯過特定文檔。這個概念完全違背了SQL數據庫的行爲,它始終考慮完整的數據池。
但lucene也支持另一種機制。您可以代替爲收集器定義MAX_RESULTS,而是定義要等待結果集的時間量。例如,你可以定義你總是想在300ms後停止收集器。這是一個很好的方法來保護您的應用程序的性能問題。但是,如果您想確保計算所有相關文檔,則必須將MAX_RESULTS的參數或最大等待時間設置爲無限值。
嗨,你能解釋一下在lucene 4.x和我也面臨同樣的問題的分頁。 – 2014-02-04 12:23:49
我一直在使用上面第三段討論的方法。除了非常深的分頁(沒有意外),它表現相當好。 – hudsonb 2014-02-11 11:38:07