我怎样才能让Lucene做简单、平平的评分呢?

我怎样才能让Lucene做简单、平平的评分呢?,lucene,Lucene,让我先说一句,我不是以一种非常普通的方式使用Lucene,并解释我的问题是如何有意义的。我用Lucene搜索结构化记录。也就是说,索引的每个文档都是一组字段,其中包含给定集合中的短值。对每个字段进行分析和存储,分析生成的标记通常不超过3个,在大多数情况下仅生成1个标准化标记。例如,假设我们为每个文件存储两个字段:文件路径和1-5中的用户评级。路径使用PathHierarchyTokenizer进行标记,评级按原样存储。所以,如果我们有一个像 path: "/a/b/file.txt" ratin

让我先说一句,我不是以一种非常普通的方式使用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以概述的方式记录文档?针对索引运行的查询不是由用户生成的,而是由系统生成的,并附加了一个可选的过滤器,这意味着它们都有一个固定形式的多个术语查询,加入到布尔查询中,与任何模糊文本搜索不同。目前,我没有选择用其他东西替换Lucene,但欢迎对未来的发展提出建议。

我怀疑是否有现成的东西可以使用,所以很可能您需要实现自己的记分器,并在搜索时使用它。对于复杂的情况,您可能希望这样做,但对于像您这样的简单情况,将
tf
因子设置为原始频率(相关文档中指定的术语数量)和所有其他组件设置为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不同的内容的方法)

以及刚刚打开的
索引搜索器