Zend_Search_Lucene改变术语频率问题

时间:2010-07-17 10:19:15

标签: zend-framework lucene zend-search-lucene

我正在尝试更新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()功能。

对此有任何帮助,我会非常感激,因为此刻它真的搞乱了我的搜索。

谢谢,

捐赠

1 个答案:

答案 0 :(得分:0)

我会尝试两件事来调试它:

  1. 构建一个非常小的索引 - 两个文档,每个文档中有一个字段,第一个字段为“boat”,第二个字段为“boat boat”。测试你的搜索。
  2. 尝试仅覆盖tf()函数。这是你想要的改变。覆盖其他部分(例如规范)需要使用新的相似性函数重新索引。确保在重建索引之前确实需要这个。
  3. 总的来说,改变tf()函数似乎是正确的做法。如果你只想要一个相对的订单而不关心绝对分数。