4

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

1 に答える 1

4

femtoRgonのアドバイスに従って、スコア計算のデバッグ要素を確認しました。私が見つけたのは、計算が実際に数学的に同等であるということです。唯一の違いは、クエリの結合計算では中間結果を保存することです。より正確には、各サブクエリの合計への寄与を変数に格納します。どうやら、中間結果を保存するために停止すると、数値エラーが累積する効果があります。中間結果を保存するたびに、精度がいくらか失われます。アプリケーションの実際のクエリは非常に大きいため (簡単な例のクエリとは異なり)、失われる精度が多くあり、蓄積されたエラーによって、返されるドキュメントのランキング順序が変わることさえあります。

したがって、用語の結合クエリは、クエリの結合クエリよりもわずかに優れたランキングを与えると予想されます。これは、クエリの結合クエリがより大きな数値エラーを蓄積するためです。

于 2013-07-11T12:41:35.857 に答える