首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >似乎等价的Solr查询之间的评分差异

似乎等价的Solr查询之间的评分差异
EN

Stack Overflow用户
提问于 2013-07-10 13:18:03
回答 1查看 149关注 0票数 4

据我所知,以下两个查询应该是等价的。

即,score(q1, d) = score(q2, d)对语料库中的每个文档d

查询1:evolution OR selection OR germline OR dna OR rna OR mitochondria

查询2:(evolution OR selection OR germline) OR (dna OR rna OR mitochondria)

查询在逻辑上显然是等价的(它们都返回相同的文档集)。另外,这两个查询都由相同的6个术语组成,每个查询在两个查询中都有1的提升。因此,每个学期对总分的贡献都是相同的(相同的TF、相同的国防军、相同的助推)。

尽管如此,的查询并没有给出相同的分数

一般来说,术语连接(a OR b OR c OR d)与查询连接((a OR b) OR (c OR d))并不相同。这两种类型的查询之间的语义差异是什么?是什么原因导致他们得到不同的分数?

我之所以问这个问题,是因为我正在构建一个定制的请求处理程序,在该处理程序中,我构建了第二种查询类型(查询的连接),而实际上我可能需要构造第一种查询类型(术语的连接)。换句话说,这就是我要做的:

代码语言:javascript
复制
Query q1 = ... //conjunction of terms evolution, selection, germline
Query q2 = ... //conjunction of terms dna, rna, mitochondria
Query conjunctionOfQueries = new BooleanQuery();
conjunctionOfQueries.add(q1, BooleanClause.Occure.SHOULD);
conjunctionOfQueries.add(q2, BooleanClause.Occure.SHOULD);

也许我应该这么做:

代码语言:javascript
复制
List<String> terms = ... //extract all 6 terms from q1 and q2
List<TermQuery> termQueries = ... //create a new TermQuery from each term in terms
Query conjunctionOfTerms = new BooleanQuery();
for (TermQuery t : termQueries) {
    conjunctionOfTerms.add(t, BooleanClause.Occure.SHOULD);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-11 12:41:35

我遵循费托尔贡的建议来检查分数计算的调试元素。我发现这些计算在数学上是等价的。唯一的区别是,在查询连接计算中,我们存储中间结果。更准确地说,我们将每个子查询的贡献存储在一个变量中。显然,为了存储中间结果而停止,会积累一个数值误差:每次存储中间结果时,我们都会失去一定的准确性。由于应用程序中的实际查询相当大(不像琐碎的示例查询),因此会丢失大量的准确性,而且累积的错误有时甚至会更改返回文档的排序顺序。

因此,术语连词查询的排序要略好于查询连接查询,因为查询的关联查询累积了更大的数字错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17571681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档