我如何要求Lucene做简单,平坦的评分?

时间:2013-08-14 11:16:45

标签: lucene

让我先说一下,我没有以一种非常普遍的方式使用Lucene并解释我的问题是如何理解的。我正在使用Lucene在结构化记录中进行搜索。也就是说,索引的每个文档都是一组具有给定集合的短值的字段。分析并存储每个字段,分析通常不超过3个,在大多数情况下只有1个标准化令牌。作为一个例子,我们存储两个字段的想象文件:文件的路径和1-5的用户评级。该路径使用PathHierarchyTokenizer进行标记,并且评级仅按原样存储。所以,如果我们有一个像

这样的文件
path: "/a/b/file.txt"
rating: 3

此文档的路径字段将包含标记“/ a”,“/ a / b”和“/a/b/file.ext”,以及对标记“3”进行评级。

我希望针对“path:/ a path:/ a / b path:/a/b/different.txt rating:1”这样的查询对此文档进行评分,并获得值2 - 这些术语的数量匹配。

我的理解和观察是文档的得分取决于各种术语指标,并且每个文档都有很多字段,我绝对不会得到简单的整数得分。

有没有办法以概述的方式制作Lucene得分文件?对索引运行的查询不是由用户生成的,而是由系统构建并附加了一个可选的过滤器,这意味着它们都有一个固定形式的多个TermQuerys连接在一个BooleanQuery中,没有任何模糊文本搜索。目前我没有选择用其他东西取代Lucene,但欢迎提出未来发展的建议。

1 个答案:

答案 0 :(得分:1)

我怀疑有什么东西可以使用,所以很可能你需要实现自己的得分手并在搜索时使用它。对于复杂的情况,您可能需要play around with queries,但对于像您这样的简单情况,overwrite DefaultSimilaritytf因子设置为原始频率(相关文档中指定术语的数量)和所有其他组件1.这样的事情:

public class MySimilarity extends DefaultSimilarity {

    @Override
    public float computeNorm(String field, FieldInvertState state) {
        return 1;
    }

    @Override
    public float queryNorm(float sumOfSquaredWeights) {
        return 1;
    }

    @Override
    public float tf(float freq) {
        return freq;
    }

    @Override
    public float idf(int docFreq, int numDocs) {
        return 1;
    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        return 1;
    }

}

(注意,tf()是返回不同于1)的唯一方法

IndexSearcher上的set similarity