2013-07-10 27 views
4

據我所知Solr's scoring function,以下兩個查詢應該是等效的。看似等價的Solr查詢之間的得分差異

即,每個文獻在文集中的score(q1, d) = score(q2, 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))不同。這兩種查詢之間的語義區別是什麼?是什麼導致他們導致不同的評分?

我問的原因是我建立了一個自定義的請求處理程序,我在其中構建第二種查詢類型)。換句話說,這是我在做什麼:

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

您是否嘗試過在結果中獲得[解釋](http://wiki.apache.org/solr/CommonQueryParameters#debug.explain.structured)?我想知道queryparser可能會產生一個稍微不同於你所期望的查詢。 – femtoRgon

+0

@femtoRgon:謝謝,您的評論有助於找到答案。如果你有興趣,請看下面的波紋管。 – snakile

回答

4

我已經按照femtoRgon's advice檢查分數計算的調試元素。我發現的是,這些計算確實在數學上是等價的。唯一的區別是在結合查詢計算我們存儲中間結果。更準確地說,我們將貢獻存儲在變量中的每個子查詢的總和中。顯然,爲了存儲中間結果而停下來會產生累積數字錯誤的效果:每次我們存儲中間結果時,我們都會失去一些準確性。由於應用程序中的實際查詢相當大(不像簡單的示例查詢),因此有很多精確性會丟失,累積錯誤有時甚至會改變返回文檔的排名順序。

所以一起-的-方面查詢有望給一個比一起-的查詢查詢稍微更好的排名,因爲一起-的查詢查詢積累了較大的數值誤差。

+1

+1這真的很有趣。所以,作爲一個很好的經驗法則,人們應該儘量表達搜索條件,而不需要不必要的括號。 – Bohemian