2012-03-26 98 views
2

在我們的一個項目中,我們使用舊的Lucene版本(2.3.2)。我現在正在研究當前的Lucene版本(3.5.0)並嘗試重新編寫舊代碼。在舊項目中,我們擴展了TopFieldDocCollector以在collect()方法中執行一些額外的過濾。但是,我對理解新收集器類有點麻煩,但我找不到一個好例子。將Lucene HitCollector(2.x)遷移到收集器(3.x)

1)方法setScorer()。我如何/從哪裏獲得Scorer對象?

2)方法collect()。我想我需要創建自己的Collection並存儲我感興趣的docIds,對嗎?

3)如果不是擴展TopDocsCollector,我需要實現一個PriorityQueue在構造函數中使用,正確嗎?它似乎沒有標準的實施。但是我仍然需要自己的Collection來存儲docIds(或者說ScoreDocs),並且在搜索完成後調用populateResults?

總體而言,它似乎是延長收藏家是(很多)不是擴展TopDocsCollector更容易,但也許我失去了一些東西。

回答

4
  1. setScorer()是一個掛鉤,當IndexSearcher實際進行搜索時,Scorer被傳入。因此,如果您關心所有分數(例如,將傳入的分數器保存起來,以便您可以使用它),則基本上可以覆蓋此方法。從它的javadoc:

    連續調用之前調用{@link #collect(INT)}。實現 需要將當前文檔的得分(傳入到 {@link #collect(INT)}),必要時應該保存傳入的得分手,叫 scorer.score()。

  2. 收集()被調用用於每個匹配文檔,傳入每個段的docID。請注意,如果您需要「重新分派的docid」(相對於其所有細分受衆羣中的整個讀者),那麼您必須重寫setNextReader,保存docBase並計算docBase + docid。從收集的javadoc:

    注:傳遞給收集 方法的文檔是相對於當前讀者。如果您的 收集器需要將其解析爲多讀者的 的docID空間,則必須通過從最近的setNextReader調用中記錄 docBase來重新設置它。

  3. TopDocsCollector是TopFieldCollector(按字段排序)和TopScoreDocCollector(按分數排序)的基類。如果您正在編寫按分數排序的自定義收集器,則可能更容易擴展TopScoreDocCollector。

另外:最簡單的收集器例子是TotalHitCountCollector!

+0

謝謝。很高興知道setScorer(),我不理解API文檔,並認爲我必須自己創建Scorer並將其傳入以獲取分數。 – 2012-03-26 14:45:10

相關問題