1

问候,

我有以下 Apache Lucene 片段,它给了我一些不错的结果:

int numHits=100;
        int resultsPerPage=100;
        IndexSearcher searcher=new IndexSearcher(reader);
        TopScoreDocCollector collector=TopScoreDocCollector.create(numHits,true);
        Query q=parser.parse(queryString);
        searcher.search(q,collector);
        ScoreDoc[] hits=collector.topDocs(0*resultsPerPage,resultsPerPage).scoreDocs;

        Results r=new Results();
        r.length=hits.length;
        for(int i=0;i<hits.length;i++){
            Document doc=searcher.doc(hits[i].doc);
            double distanceKm=getGreatCircleDistance(lucene2double(doc.get("lat")), lucene2double(doc.get("lng")), Double.parseDouble(userLat), Double.parseDouble(userLng));
            double newRelevance=((1/distanceKm)*Math.log(hits[i].score)/Math.log(2))*(0-1);
            System.out.println(hits[i].doc+"\t"+hits[i].score+"\t"+doc.get("content")+"\t"+"Km="+distanceKm+"\trlvnc="+String.valueOf(newRelevance));
        } 

我想知道, hits[i].score 总是在 0 和 1 之间吗?好像是这样,但我不能确定。我什至检查了 Lucene 文档(类 ScoreDocs),但无济于事。您会看到我正在计算基于 hits[i].score 的“newRelevance”值的日志。我需要 hits[i].score 介于 0 和 1 之间,因为如果它低于零,我会得到一个错误;大于 1,符号将从负变为正。

我希望那里的一些 Lucene 专家可以为我提供一些见解。

非常感谢,

4

3 回答 3

4

是的,分数将始终介于 0 和 1 之间。

当 Lucene 计算分数时,它会为字段中的术语匹配找到单独的分数,等等......并将它们总计。如果排名最高的命中的总分大于 1,则所有文档的分数都被归一化为 0 和 1 之间,排名最高的文档的分数为 1。但是,如果没有文档的总分大于 1,则不会发生归一化并且分数按原样返回。这就是为什么有时顶部文档的得分为 1,而其他时候的得分低于 1。


编辑:做了更多的研究,答案很可能是 no。在我熟悉的 Lucene 版本(v2.3.2)中,搜索通过Hits对象,GetMoreDocs()如果其中任何一个大于 1,则其方法会将分数标准化。在以后的版本中,似乎情况并非如此,因为Hits类不再使用。您的分数是否在 0 和 1 之间取决于您使用的 Lucene 版本以及用于搜索的机制。

引用Lucene 邮件列表

分数是一个大于 0 的任意数字。它没有标准化为任何东西,它应该只用于例如对结果进行排序

于 2011-01-09T22:27:34.287 回答
1

我相信 Lucene 分数总是标准化的,即得分最高的命中1(或接近它)。值应始终介于0和之间1。通过扩展,这意味着分数没有客观意义,即它们不能与来自同一结果集的其他命中之外的任何东西进行比较。

免责声明:我不是 Lucene 科学家。这仅基于我对 Lucene 实际运行的观察,不过,我从未见过实际记录过这一点,所以我可能完全搞错了。

于 2011-01-09T22:13:19.580 回答
0

分数在 1 和 0 之间,但最高分数不一定是 1。分数总是相互关联的,不应该真正在两个不同查询的分数之间进行直接比较。

于 2011-01-09T22:22:54.210 回答