Apache Lucene:相关性评分总是介于0和1之间吗?

时间:2011-01-09 22:09:22

标签: apache lucene relevance

问候,

我有以下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));
        } 

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

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

非常感谢,

3 个答案:

答案 0 :(得分:4)

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

当Lucene计算得分时,它会在字段等内找到术语命中的个别得分......并总计得分。如果排名最高的命中总数大于1,则所有文档分数标准化为0到1之间,排名最高的文档的分数为1.如果没有文档的总数大于1,则不会发生规范化并按原样返回分数。这就是为什么顶级文档有时得分为1而其他时间得分低于1的原因。


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

引用Lucene mailing list

  

得分是任意数>它应该没有任何标准化   仅用于例如对结果进行排序

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

得分在1到0之间,但最高得分不一定是1。 分数总是相对于彼此,并且不应该在两个不同查询的分数之间进行直接比较。