2014-02-20 77 views
0

我想通過solr查詢基於一個常見的「名稱」字段來比較solr中的兩個文檔(說Doc A,Doc B)。基於查詢A.name,我得到一個結果文檔B,其相關性分數爲SCR1。現在,如果我以相反的方式做到這一點,即我用B.name進行查詢,並在結果中的某個地方獲得文檔A,但是此時A的分數爲而不是的SCR1相同。比較兩個solr文檔

我相信這是因爲沒有。 Doc A.name和Doc B.name中的術語不同,所以相似性得分不一樣。這是不同的原因嗎?

無論如何我可以得到相同的分數(如上所述)嗎?
難以比較任何兩個查詢的得分嗎? 是否可以在本地Lucene API中執行此操作?

回答

0

要回答你的第二個問題,不得比較兩個文檔的分數。

在java-users lucene郵件列表中發佈了一個類似的問題。

這裏有一個鏈接:Compare scores across queries

給出說明那裏爲什麼必須這樣做。

0

我不太清楚我對你是指查詢清楚,但我們說的情況是這樣的:

  • 文件答:名稱=「卡洛斯·費爾南多·路易斯·瑪麗亞·維克托米格爾·拉斐爾·加布裏埃爾·貢扎加澤維爾弗朗西斯科·德·阿西斯何西芒德布拉幹薩,博亞波旁Ë薩克森 - Coburgo - 哥達」

  • 文檔B:NAME =‘托馬斯·安東尼奧·岡薩加’

如果您搜索「gonzaga」,則文檔B將獲得更高的分數,因爲儘管每個名稱中有一個匹配,但文檔B的名稱短得多,只有三個詞,而較短的字段更重。這是LengthNorm指的是TFIDFSimilarity documentation

但還有其他因素。如果我們只是扔掉每個名稱到的QueryParser,看看會發生什麼吧,是這樣的:

Query queryA = queryparser.parse(docA.name); 
Query queryB = queryparser.parse(docB.name); 

然後生成的查詢是很大的不同:

name:carlos name:fernando name:luis name:maria name:victor name:miguel name:rafael name:gabriel name:gonzaga name:xavier name:francisco name:de name:assis name:jose name:simao name:de name:braganca name:baboia name:bourbon name:e name:saxe name:coburgo name:gotha 

VS

name:tomas name:antonio name:gonzaga 

有爲什麼這些會產生不同的分數是很多原因。上面討論的lengthNorm,可以提高匹配更多查詢詞的結果的coord因子很可能會起作用tf,這會使文檔中更多的詞匹配更多的idf,這更適合於整個詞出現頻率較低索引等。

得分只與查詢運行的結果集相關。對查詢或索引狀態的更改可能會導致不同的分數,而且它們不打算具有可比性。您可以使用IndexSearcher.explain來了解如何計算分數。

+0

「這些產生相同分數的原因有很多。」你的意思是爲什麼他們不會**得到相同的分數?在你的例子中,queryA和queryB,讓我們說,對於queryA響應,我們得到帶有SCR1分數的DocB,對於queryB響應,我們得到帶有SCR1的DocA。這兩個分數是否相同。看起來不會,但只是想澄清問題 – Ganesh

+1

對,你不會指望得分相等。即使在這些只有兩個文檔的簡單情況下,lengthNorm,coord因子和queryNorm也會不同。 – femtoRgon