我正在尝试比较solr中的两个文档(比如文档A,文档B),基于使用solr查询的常见“名称”字段。基于查询A.name,我得到结果文档B,其相关性得分为SCR1。现在,如果我以相反的方式这样做,即我用B.name查询,我在结果的某个地方得到文件A,但是这个时间B与A的得分是不相同的SCR1。
我相信这是因为没有。 Doc A.name和Doc B.name中的术语不同,因此相似性得分不同。这是造成这种差异的原因吗?
无论如何,无论如何我都能得到相同的分数(如上所述)? 是否无法比较任何两个查询的得分? 是否可以在原生Lucene API中执行此操作?
答案 0 :(得分:0)
要回答第二个问题,不得比较两个文件的分数。
类似的问题发布在java-users lucene邮件列表中。
以下是指向它的链接:Compare scores across queries
这里有一个解释,为什么不能这样做。
答案 1 :(得分:0)
我不太清楚我对你所提到的疑问是否清楚,但让我们说情况是这样的:
Doc A:姓名=“CarlosFernandoLuísMariaVíctorMiguelRafael Gabriel Gonzaga Xavier Francisco deAssisJoséSimãodeBragança,SabóiaBourbone Saxe-Coburgo-Gotha”
Doc B:姓名=“TomásAntónioGonzaga”
如果您搜索“gonzaga”,文档B将获得更高的分数,因为虽然每个名称中只有一个匹配,但文档B的名称更短,只有三个术语,更短的字段称重更多巨资。这是TFIDFSimilarity documentation中提到的 LengthNorm 。
但还有其他因素。如果我们只是将每个名字放入queryparser中,看看会出现什么,例如:
Query queryA = queryparser.parse(docA.name);
Query queryB = queryparser.parse(docB.name);
然后生成的查询大不相同:
name:carlos name:fernando name:luis name:maria name:victor name:miguel name:rafael name:gabriel name:gonzaga name:xavier name:francisco name:de name:assis name:jose name:simao name:de name:braganca name:baboia name:bourbon name:e name:saxe name:coburgo name:gotha
VS
name:tomas name:antonio name:gonzaga
为什么这些会产生不同的分数有很多原因。上面讨论的lengthNorm,coord因子,它可以增加与更多查询术语相匹配的结果,很可能会起作用,这会使文档的权重更加重要,idf,更喜欢在整个项目中出现频率较低的术语指数等等。
分数仅与查询运行的结果集相关。对查询或索引状态的更改可能会导致不同的分数,并且它们无法进行比较。您可以使用IndexSearcher.explain来了解分数的计算方式。