Apache自定义Lucene评分

时间:2013-04-24 00:00:32

标签: lucene size similarity scoring

我试图修改Lucene的默认相似度得分如下。假设每个文档以及查询都包含唯一的单词。查询q和文档d的自定义相似度得分应为com(d,q)/(size(d)+size(q))。其中com(d,q)是两者中出现的术语数量(请注意,查询和文档中没有重复的术语)。 size(d)size(q)是每个中的术语数量。我们使用WhiteSpaceAnalyzer。我们假设术语和文档频率为1,术语不会提升。

1 个答案:

答案 0 :(得分:2)

要应用自己的评分,您需要将Similarity设置为您自己的实施。您将需要在computeNorm方法中处理sive,该方法存储在索引时。其余的应由coord处理。您可以免费扩展TFIDFSimilarity并获得大量内容,让您不必担心自己设置SimScorer等等。你只需要剔除很多功能。请记住,这将是存储在每个文档中的额外信息

所以,比如:

class MySimilarity extends TFIDFSimilarity {
    // 1/size(d) where size(d) is the number of terms in the Field,
    // rather than the Document (which doesn't really make sense)
    computeNorm(FieldInvertState state, Norm norm) {
        norm.setByte(encodeNorm(1 / state.getLength()));  // encodeNorm loses a great deal of precision, FYI.
    }

    // 1/size(q)
    float coord(int overlap, int maxOverlap) {
        return 1 / maxOverlap;
    }

    float idf(long docFreq, long numDocs) {
        return 1
    }

    float queryNorm(float sumOfSquaredWeights) {
        return 1;
    }

    float scorePayload(int doc, int start, int end, BytesRef payload) {
        return 1;
    }

    float sloppyFreq(int distance) {
        return 1;
    }

    float tf(float freq) {
        return 1;
    }

    float tf(int freq) {
        return 1;
    }
}

我相信,应该按照以下方式计算分数:

(1 / size(q)) * ∑ (1 / size(d))

哪个应该可以解决你想要的问题。

我非常强烈地感觉到你把婴儿扔出洗澡水。