Java 看似等价的Solr查询之间的得分差异

Java 看似等价的Solr查询之间的得分差异,java,solr,lucene,Java,Solr,Lucene,据我所知,以下两个查询应该是等价的 即,score(q1,d)=语料库中每个文档的得分(q2,d) 问题1:进化或选择或种系或dna或rna或线粒体 问题2:(进化或选择或种系)或(dna或rna或线粒体) 这些查询显然在逻辑上是等价的(它们都返回相同的文档集)。此外,两个查询都由相同的6个术语组成,每个术语在两个查询中的升幅均为1。因此,每个术语对总分的贡献应该是相同的(相同的TF、相同的IDF、相同的提升) 尽管如此,这些查询给出的分数并不相同 一般来说,术语的连词(a或b或c或d)与查询的

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

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

问题1:
进化或选择或种系或dna或rna或线粒体

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

这些查询显然在逻辑上是等价的(它们都返回相同的文档集)。此外,两个查询都由相同的6个术语组成,每个术语在两个查询中的升幅均为1。因此,每个术语对总分的贡献应该是相同的(相同的TF、相同的IDF、相同的提升)

尽管如此,这些查询给出的分数并不相同

一般来说,术语的连词(
a或b或c或d)与查询的连词(
(a或b)或(c或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);
}
列出术语=//从q1和q2中提取所有6个术语
列表termQueries=//从术语中的每个术语创建新的术语查询
Query connectionofterms=new BooleanQuery();
for(TermQuery t:TERMQUERES){
add(t,booleansclause.occurrent.SHOULD);
}
我已经检查了分数计算的调试元素。我发现这些计算在数学上是等价的。唯一的区别是,在查询计算的结合中,我们存储中间结果。更准确地说,我们将对每个子查询的总和的贡献存储在一个变量中。显然,为了存储中间结果而停止会积累一个数字错误:每次存储中间结果时,我们都会失去一些准确性。由于应用程序中的实际查询非常大(不像简单的示例查询),因此会丢失大量的准确性,累积的错误有时甚至会改变返回文档的排名顺序


因此,术语连词查询比查询连词查询的排名稍好,因为查询连词查询累积了更大的数字错误。

您是否尝试过对结果进行分析?我想知道询问者产生的查询是否与您预期的略有不同。@femtoRgon:谢谢,您的评论帮助您找到了答案。如果你感兴趣,请看下面的内容。因此,作为一个很好的经验法则,应该尝试在没有不必要的括号的情况下表示搜索条件。