【问题标题】:How can I ask Lucene to do simple, flat scoring?如何让 Lucene 进行简单、平坦的评分?
【发布时间】:2013-08-16 07:39:19
【问题描述】:

让我先说我没有以非常常见的方式使用 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 评分文档?针对索引运行的查询不是由用户生成的,而是由系统构建的,并且附加了一个可选的过滤器,这意味着它们都有固定形式的几个 TermQuery 加入一个 BooleanQuery,与任何模糊文本搜索完全不同。目前我没有选择用其他东西替换 Lucene,但欢迎对未来的开发提出建议。

【问题讨论】:

    标签: lucene


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2013-06-08
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 2019-04-13
      相关资源
      最近更新 更多