1

我正在尝试更新对我的 Lucene 索引中文档术语的搜索。目前,搜索对术语在文档中出现的次数进行评分。如果该术语存在,我想做的是评分,而不是该术语存在的次数。因此,包含该术语的文档一次的得分与包含该术语的文档的 100 次相同。

我试图用我自己的类扩展 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()函数。

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

谢谢,

授予

4

1 回答 1

0

我会尝试两件事来调试这个:

  1. 建立一个非常小的索引 - 两个文档,每个文档都有一个字段,第一个包含单词“boat”,第二个包含短语“boat boat”。测试你的搜索。
  2. 尝试仅覆盖 tf() 函数。这就是你想要的改变。覆盖其他部分,例如规范,需要使用新的相似性函数重新索引。确保在重新索引之前确实需要它。

总体而言,更改 tf() 函数似乎是正确的做法。前提是您只需要相对顺序而不关心绝对分数。

于 2010-07-20T07:57:01.233 回答