据我了解Solr 的打分函数,以下两个查询应该是等价的。
即,score(q1, d) = score(q2, d)
对于语料库中的每个文档d
。
查询一: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、相同的 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);
}