2010-07-17 62 views
1

我正在嘗試更新我的Lucene索引內文檔術語的搜索。目前搜索得分是該詞在文檔中出現的次數。我想要做的是評分,如果該術語存在,而不是該術語存在的次數。因此,一個包含該術語的文檔與一個包含100個術語的文檔的評分一樣。Zend_Search_Lucene更改術語頻率問題

我試圖擴展Zend_Search_Lucene_Search_Similarity與我自己的類,但老實說,我不知道這是否工作正常,因爲分數仍然很低。

class MySimilarity extends Zend_Search_Lucene_Search_Similarity{ 

//override the default frequency of searching 
public function tf($freq){ 
    return 1.0; 
} 

public function lengthNorm($fieldName, $numTerms) { 
    return 1.0/sqrt($numTerms); 
} 

public function queryNorm($sumOfSquaredWeights) { 
    return 1.0/sqrt($sumOfSquaredWeights); 
} 

public function sloppyFreq($distance) { 
    return 1.0; 
} 

public function idfFreq($docFreq, $numDocs) { 
    return log($numDocs/(float)($docFreq+1)) + 1.0; 
} 

public function coord($overlap, $maxOverlap) { 
    return $overlap/(float)$maxOverlap; 
} 
} 

現在,這是從搜索良好的舊谷歌時發現的例子。然而,我所做的唯一真正的改變是tf()函數。

任何與此有關的幫助,我會非常好,因爲目前它真的搞亂了我的搜索。

感謝,

格蘭特

回答

0

我將要做兩件事情調試此:

  1. 構建一個非常小的指數 - 兩個文件,在每一個領域,第一個具有字「船」,第二個詞「船船」。測試你的搜索。
  2. 嘗試僅覆蓋tf()函數。這是你想要的改變。重寫其他部分(如規範)需要使用新的相似性函數進行重新索引。確保在重新索引之前確實需要它。

總的來說,改變tf()函數似乎是正確的做法。這隻要你只想要一個相對的順序而不關心絕對分數。

+0

獲得絕對分數的最佳方法是什麼?會是idfFreq()嗎?謝謝,格蘭特 – 2010-07-21 18:50:21

+1

爲什麼你需要絕對的分數? 我建議你閱讀http://lucene.apache.org/java/2_4_0/scoring.html 和 http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity .html Java Lucene有一個方便的explain()函數,它描述了文檔爲什麼得到它的分數。我在Zend找不到一個,但你可能有更好的運氣。 無論如何,對於搜索,你只需要正確的文件順序,因此相對得分是重要的。 – 2010-07-22 07:03:49

+0

感謝尤瓦爾,那些文件指出我正確的方向。 – 2010-07-22 21:35:20