【问题标题】:Zend_Search_Lucene changing term frequency problemZend_Search_Lucene 改变词频问题
【发布时间】:2010-07-17 10:19:14
【问题描述】:

我正在尝试更新对我的 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;
}
}

现在这是根据我在搜索良好的旧 google 时找到的示例构建的。然而,我所做的唯一真正的改变是 tf() 函数。

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

谢谢,

授予

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 获得绝对分数的最佳方法是什么?会是 idfFreq() 吗???谢谢,格兰特
    • 为什么需要绝对分数?我建议您阅读lucene.apache.org/java/2_4_0/scoring.htmllucene.apache.org/java/2_4_0/api/org/apache/lucene/search/… Java Lucene 有一个方便的 explain() 函数,它描述了文档获得分数的原因。我在 Zend 中找不到,但你可能有更好的运气。无论如何,对于搜索,您只需要正确的文档顺序,因此相对分数是重要的。
    • 感谢 Yuval,这些文件为我指明了正确的方向。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多