2014-02-20 78 views
0

我想通过solr查询基于一个常见的“名称”字段来比较solr中的两个文档(说Doc A,Doc B)。基于查询A.name,我得到一个结果文档B,其相关性分数为SCR1。现在,如果我以相反的方式做到这一点,即我用B.name进行查询,并在结果中的某个地方获得文档A,但是此时A的分数为而不是的SCR1相同。比较两个solr文档

我相信这是因为没有。 Doc A.name和Doc B.name中的术语不同,所以相似性得分不一样。这是不同的原因吗?

无论如何我可以得到相同的分数(如上所述)吗?
难以比较任何两个查询的得分吗? 是否可以在本地Lucene API中执行此操作?

回答

0

要回答你的第二个问题,不得比较两个文档的分数。

在java-users lucene邮件列表中发布了一个类似的问题。

这里有一个链接:Compare scores across queries

给出说明那里为什么必须这样做。

0

我不太清楚我对你是指查询清楚,但我们说的情况是这样的:

  • 文件答:名称=“卡洛斯·费尔南多·路易斯·玛丽亚·维克托米格尔·拉斐尔·加布里埃尔·贡扎加泽维尔弗朗西斯科·德·阿西斯何西芒德布拉干萨,博亚波旁Ë萨克森 - Coburgo - 哥达”

  • 文档B:NAME =‘托马斯·安东尼奥·冈萨加’

如果您搜索“gonzaga”,则文档B将获得更高的分数,因为尽管每个名称中有一个匹配,但文档B的名称短得多,只有三个词,而较短的字段更重。这是LengthNorm指的是TFIDFSimilarity documentation

但还有其他因素。如果我们只是扔掉每个名称到的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因子很可能会起作用tf,这会使文档中更多的词匹配更多的idf,这更适合于整个词出现频率较低索引等。

得分只与查询运行的结果集相关。对查询或索引状态的更改可能会导致不同的分数,而且它们不打算具有可比性。您可以使用IndexSearcher.explain来了解如何计算分数。

+0

“这些产生相同分数的原因有很多。”你的意思是为什么他们不会**得到相同的分数?在你的例子中,queryA和queryB,让我们说,对于queryA响应,我们得到带有SCR1分数的DocB,对于queryB响应,我们得到带有SCR1的DocA。这两个分数是否相同。看起来不会,但只是想澄清问题 – Ganesh

+1

对,你不会指望得分相等。即使在这些只有两个文档的简单情况下,lengthNorm,coord因子和queryNorm也会不同。 – femtoRgon