Solr のスコアリング関数を理解しているので、次の 2 つのクエリは同等である必要があります。
つまり、コーパス内の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、同じ IDF、同じブースト)。
それにもかかわらず、クエリは同じスコアを与えません。
一般に、用語の接続詞 ( a OR b OR c OR d
) はクエリの接続詞 ( ) と同じではありません(a OR b) OR (c OR d)
。2 種類のクエリの意味上の違いは何ですか? スコアが異なる原因は何ですか?
私が質問している理由は、2 番目のタイプのクエリ (クエリの結合) を作成するカスタム リクエスト ハンドラーを作成しているのに対し、実際には最初のタイプのクエリ (用語の結合) を作成する必要があるためです。言い換えれば、これは私がやっていることです:
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);
}