java - 看似等效的 Solr 查询之间的评分差异

标签 java solr lucene

据我了解Solr's scoring function ,以下两个查询应该是等价的。

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

查询 1:进化或选择或种系或 dna 或 rna 或线粒体

查询 2:(进化或选择或种系)或(dna 或 rna 或线粒体)

这两个查询在逻辑上显然是等价的(它们都返回同一组文档)。此外,两个查询都包含相同的 6 个术语,并且每个术语在两个查询中都有 1 的提升。因此,每个术语对总分的贡献应该相同(相同的 TF、相同的 IDF、相同的提升)。

尽管如此,查询不会给出相同的分数

一般来说,术语的连词 (a OR b OR c OR d) 与查询的连词 ((a OR b) OR (c OR d) )。两种类型的查询之间的语义区别是什么?是什么导致他们得出不同的分数?

我问的原因是我正在构建一个自定义请求处理程序,在其中构建第二种查询(查询的结合),而我实际上可能需要构建第一种查询(术语的结合) .换句话说,这就是我正在做的:

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);

也许我真的应该这样做:

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);
}

最佳答案

我关注了femtoRgon's advice检查分数计算的调试元素。我发现这些计算在数学上确实是等价的。唯一的区别是在conjunction-of-queries 计算中我们存储了中间结果。更准确地说,我们将每个子查询对总和的贡献存储在一个变量中。显然,为了存储中间结果而停止会产生累积数值误差的效果:每次我们存储中间结果时,我们都会失去一些准确性。由于应用程序中的实际查询非常大(不像简单的示例查询),因此会损失很多准确性,累积的错误有时甚至会改变返回文档的排名顺序。

因此,conjunction-of-terms 查询预计会比 conjunction-of-queries 查询给出更好的排名,因为 conjunction-of -queries 查询累积了更大的数值误差。

关于java - 看似等效的 Solr 查询之间的评分差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571681/

相关文章:

java - ElasticSearch 中的复杂 Lucene 查询

solr - 拼写检查导致 Core Reload 挂起

lucene - Lucene/Elastic Search中使用添加 token 的分析器的搜索行为?

java - 范围或 ms sql xml 参数是什么?

java - 如何使用 spring 从属性文件加载 map

mysql - 搜索文档内容的建议 - Windows Search 好用吗?简单的MySQL?

java - Solr 文档删除延迟

java - 如何在 JPQL 中执行 EAGER 获取

java - PayPal - 在 java 中获取授权 token 生命周期/过期时间(Rest API)

java - Solr 是否有 xml 替代 @Field 注释?