2011-06-27 29 views
3

我試圖在Lucene中實現一個與tf-idf無關的自定義評分公式(因此只改變相似性,例如,將不起作用)。Lucene自定義評分(Lucene 3.2)涉及遍歷索引中的所有文檔 - 最快的方式?

爲了做到這一點,我需要能夠接受我的自定義查詢併爲存儲在索引中的每個文檔生成一個分數 - 而不僅僅是匹配查詢中條款的分數(因爲我的評分涉及檢查什麼基本上都是同義詞,所以即使文檔沒有確切的術語,它仍然可以產生積極的分數)。是簡單創建IndexReader併爲所有文檔調用Document d = reader.doc(i)(如描述here)的最佳方法,然後當場生成分數?

我一直在環視Lucene的得分內部,特別是各種Scorer和Collector類,看來會發生什麼(對於Lucene 3.2)是一個Weight提供了一個Scorer,它與Collector一起循環遍歷所有文檔匹配查詢。我能否以某種方式利用此結構,但是再次獲得自定義Scorer實現來考慮所有文檔?

+0

我很好奇你想要實現什麼樣的得分。 –

回答

0

據我瞭解Lucene的,存儲在其指數(長期,DOC)對,以便查詢作爲

  1. 實現獲取包含查詢詞的文件,
  2. 得分/排序。

我從來沒有實現自己的得分,但我會首先看IndexReader.termDocs;它似乎執行步驟1.

0

IndexReader.termDocs您可以遍歷術語的發佈列表,即所有包含該術語的文檔。你可以使用它來提供你自己的查詢處理自己的Lucene的頂部,但那麼你將無法使用任何Query,Similarity和東西。

此外,如果您正在使用同義詞Lucene has some things in the contrib package。另一種可能的解決方案,不知道是否嘗試過,是通過Analyzer(或其他)將同義詞注入文檔。這樣,即使沒有查詢條件,您也可以返回文檔。

2

如果您決定使用自定義評分方案,正確的方法是使用CustomScoreQuery的子類,並覆蓋getCustomScoreProvider以返回您的子類CustomScoreProviderCustomScoreQuery構造函數需要一個子查詢。在這裏,您需要提供一個快速原生Lucene查詢,它會在通過自定義分數計算之前儘可能縮小結果集的範圍。您還可以安排將任何數量的浮動值與您的每個文檔存儲在一起,並使您的自定義分數提供者可以訪問這些值。您需要爲CustomScoreQuery的構造函數提供適當的ValueSourceQuery以獲得每個浮點值。看到這些類的Javadocs,它們寫得很好。不幸的是,我手頭沒有Java代碼片斷。