ApacheLucene:相关性得分总是在0到1之间吗?

ApacheLucene:相关性得分总是在0到1之间吗?,apache,lucene,relevance,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.

您好

我有以下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));
        } 
int numHits=100;
int resultsPerPage=100;
IndexSearcher search=新的IndexSearcher(阅读器);
TopScoreDocCollector=TopScoreDocCollector.create(numHits,true);
Query q=parser.parse(queryString);
搜索者。搜索(q,收集器);
ScoreDoc[]hits=collector.topDocs(0*resultsPerPage,resultsPerPage);
结果r=新结果();
r、 长度=hits.length;

对于(int i=0;i我认为Lucene得分始终是标准化的,即得分最高的命中率为
1
(或接近它)。然后,值应始终介于
0
1
之间。从广义上讲,这意味着分数没有客观意义,也就是说,它们不能与同一结果集中的其他命中数进行比较


免责声明:我不是一名Lucene科学家。这只是基于我对Lucene的实际观察,不过,我从来没有看到这方面的实际记录,所以我可能完全弄错了方向。

我相信Lucene得分总是正常化的,即得分最高的命中率为
1
(或接近它)。然后,值应始终介于
0
1
之间。从广义上讲,这意味着分数没有客观意义,也就是说,它们不能与同一结果集中的其他命中数进行比较


免责声明:我不是一名Lucene科学家。这只是基于我对Lucene的实际观察,不过,我从来没有看到这方面的实际记录,所以我可能完全弄错了方向。

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

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

是的,分数总是在0到1之间

当Lucene计算分数时,它会在字段等中查找术语命中的单个分数,并对其进行合计。如果排名最高的命中总数大于1,则所有文档分数都将标准化为0到1之间,排名最高的文档分数为1。但是,如果没有文档的总分数大于1,则没有标准值lisation发生并按原样返回分数。这就是为什么有时顶级文档的分数为1,而其他时间的分数低于1


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

引自:

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

是的,分数总是在0到1之间

当Lucene计算分数时,它会在字段等中查找术语命中的单个分数,并对其进行合计。如果排名最高的命中总数大于1,则所有文档分数都将标准化为0到1之间,排名最高的文档分数为1。但是,如果没有文档的总分数大于1,则没有标准值lisation发生并按原样返回分数。这就是为什么有时顶级文档的分数为1,而其他时间的分数低于1


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

引自:

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


谢谢你的回复。这就是我的想法。我想用一些官方的东西来巩固它…这是我应用程序的一个关键部分!谢谢你的回复。这就是我的想法。我想用一些官方的东西来巩固它…这是我应用程序的一个关键部分!我正在使用Lucene 2.9.2。我希望它介于0和1之间。如果相关性可以达到的话超过1时,我必须考虑使用对数以外的其他方法。这里有一个指向同一邮件线程的更好链接:。基本上,您正在尝试将距离与分数结合起来,这是一个难题。我想您可以尝试使用一些权重进行自定义排序,看看它是如何工作的。我正在使用Lucene 2.9.2。我希望它介于0和1之间。我如果相关性超过1,我必须考虑使用对数以外的其他方法。这里有一个指向同一邮件线程的更好链接:。基本上,您正在尝试将距离与分数结合起来,这是一个难题。我想您可以尝试使用一些权重进行自定义排序,看看它是如何工作的。FWIW始终在[0,1]中.Lucene使用了这种形式的修改形式,可能以复杂的方式偏离理论。FWIW始终位于[0,1]。Lucene使用了这种形式的修改形式,可能以复杂的方式偏离理论。