2013-04-03 38 views
0

我們在SOLR中有很多文檔,其中某些類型的結果往往得分太高(這主要是因爲它們通常內容很短)。所以如果我搜索一個名字,它會在更長的時間之前返回一個短文檔。SOLR相關性似乎與文檔索引長度嚴重相關

如何權衡結果,以便在相關性排序時考慮文檔的長度?

如果它有幫助(作爲cludge),我們在通常適用的文檔上設置了一個標誌,所以如果可以提升沒有設置該標誌的所有文檔,那將是我們的臨時選項。

+0

你看過[Solr Relevancy FAQ](http://wiki.apache.org/solr/SolrRelevancyFAQ) - 你可能會從那裏得到一些提示。如果沒有真正查看文檔,它有點難以給出答案。 –

+0

我一直在讀一段時間:) – Jon

+0

我通常在我的Solr請求中使用'debugQuery = on'來查看分數,它給出了很多詳細信息,但通常會很好地理解文檔排名的原因這樣。 –

回答

1

這是由長度超標引起的。使用相同匹配條件的較長文檔比短文檔的得分稍低。請參閱TFIDFSimilarity的文檔(向下滾動至「6. norm(t,d)」)以及Solr documentation here

這對於全文搜索應用程序很適用。這個想法是,與查詢匹配的內容比例較高的文檔與查詢更相關。

舉例來說,如果我搜索維基百科的文章標題,任期猴,發現文章的相關性可能是:

如果確實有必要,可以在自定義DefaultSimilarity中覆蓋此值。並覆蓋computeNorm(狀態,標準),只需return state.getBoost();

0

檢查的DefaultSimilarity 4.0

@Override 
public void computeNorm(FieldInvertState state, Norm norm) { 
    final int numTerms; 
    if (discountOverlaps) 
     numTerms = state.getLength() - state.getNumOverlap(); 
    else 
     numTerms = state.getLength(); 
    norm.setByte(encodeNormValue(state.getBoost() * ((float) (1.0/Math.sqrt(numTerms))))); 
} 

的來源,這樣numTerms對得分產生不利影響。
您可以創建一個自定義類中重寫的行爲

  1. numTerms等於1
  2. 更改計算增加上,而逆長文檔的分數現在
  3. 取下計算((float) (1.0/Math.sqrt(numTerms)))消除lengthNorm效果。