2010-04-06 61 views
14

我使用我的網站Lucene和我想要顯示從查詢總結果數,例如:如何獲得的潛在結果總數Lucene的

顯示結果XŸž

但我無法找到這將返回我的潛在結果總數的任何方法。我似乎只能找到方法,你必須指定你想要的結果數量,而且由於我只需要每頁10個,所以在結果數量中傳遞10就顯得合乎邏輯了。

或者我做錯了,我應該通過說1000,然後只是在我需要的範圍內10?

回答

15

順便說一句,因爲我知道你個人而言,我應該點爲其他人我已經知道你指的是Lucene.net,而不是Lucene :)雖然API將是相同的

在2.9.x之前的版本,你可以調用IndexSearcher.Search(Query query, Filter filter)返回d一個Hits對象,其中的一個性質[方法,在技術上,由於渣口]是Length()

這現在被標記作廢,因爲它會在3.0中被移除,的搜索返回TopDocsTopFieldDocs對象的唯一結果。

你的選擇是

一)使用IndexServer.Search(Query query, int count)它會返回一個TopDocs對象,所以TopDocs.TotalHits會告訴你總能命中,但在實際創建<count>結果

B)爲代價的快速方法是實現您自己的Collector對象(繼承自Lucene.Net.Search.Collector)並致電IndexSearcher.Search(Query query, Collector collector)。在每場比賽中,搜索方法都會在您的收藏夾上調用Collect(int docId),因此如果您在內部追蹤您獲得所有結果的方式。

應該注意的是,Lucene不是一個總體結果集查詢環境,它旨在儘可能快地向您(開發人員)發送最相關的結果。任何給你一個「總計結果」計數的方法只是一個枚舉所有匹配的包裝器(與收集器方法一樣)。

訣竅是儘可能快地保持這個枚舉。最昂貴的部分是索引中的文檔反序列化,填充每個字段等等。至少在更新的API設計中,要求您編寫自己的收集器時,通過告訴開發人員避免對索引中的每個結果進行反序列化因爲默認情況下只提供匹配的文檔ID和分數。

+0

-1對於不完整的答案(我非常感謝你幫助別人),但是'IndexServer'在哪裏? – Dementic 2014-06-23 17:42:13

+0

@Dementic'IndexServer'的引用是一個錯字,它應該在所有情況下都是'IndexSearcher'。 – 2015-07-13 07:31:01

9

頂部的文檔收集器可以實現這個要求,例如

TopDocs topDocs = searcher.search(qry, 10); 
int totalHits = topDocs.totalHits ; 

上面的查詢會計算所有命中,但回到只有10