2010-10-21 61 views
14

我正在努力解決如何改進solr搜索結果的評分。我的應用程序需要從solr結果中取得分數,並根據查詢結果的好壞來顯示一些「星號」。 5星=幾乎/精確到0星意味着與搜索不匹配,例如,只有一個元素命中。不過,我得到的分數從1.4到0.8660254都返回給我5星級的結果。我需要做的是以某種方式將這些結果轉換爲一個百分比,以便我可以用正確數量的星標記這些結果。如何規範solr/lucene分數?

,我跑這給了我1.4分的查詢是:

euallowed:true和(等級: 「2:1」)

,讓我0.8660254成績查詢是:

euallowed:true和(等級: 「2:1」 或等級: 「1」)

我已經更新了相似性,使得TF和IDF回報1.0,因爲我只INTERES如果一個文件有一個術語,而不是該文件中該術語的數量。這是我的相似度代碼是什麼樣子:

import org.apache.lucene.search.Similarity; 

public class StudentSearchSimilarity extends Similarity { 

    @Override 
    public float lengthNorm(String fieldName, int numTerms) { 
     return (float) (1.0/Math.sqrt(numTerms)); 
    } 

    @Override 
    public float queryNorm(float sumOfSquaredWeights) { 

     return (float) (1.0/Math.sqrt(sumOfSquaredWeights)); 

    } 

    @Override 
    public float sloppyFreq(int distance) { 
     return 1.0f/(distance + 1); 
    } 

    @Override 
    public float tf(float freq) { 
     return (float) 1.0; 
    } 

    @Override 
    public float idf(int docFreq, int numDocs) { 

     //return (float) (Math.log(numDocs/(double) (docFreq + 1)) + 1.0); 
     return (float)1.0; 

    } 

    @Override 
    public float coord(int overlap, int maxOverlap) { 
     return overlap/(float) maxOverlap; 
    } 
} 

,所以我想我的問題是:

  1. 如何正常化 比分的最好方法,這樣我可以計算出如何 多「星星「給予?

  2. 是否有另一種方式對 結果打分?

感謝

格蘭特

回答

15

引述http://wiki.apache.org/lucene-java/ScoresAsPercentages

人們經常要計算從Lucene的分數「百分比」,以確定什麼是「100%的完美」的比賽VS一個「50%」的匹配。這也被稱爲「歸一化分數」

不要這樣做。

說真的。不要試圖用這種方式來思考你的問題,它不會很好地結束。

該頁面舉例說明如何在理論上做到這一點,但這非常困難。

+1

赫姆...感謝。這是一個非常好的論點,但不知道當我覆蓋tf和idf會發生什麼。我想我可能不得不以另一種方式來看待這個問題。即使這意味着不被星星「打分」。 – 2010-10-23 10:50:50

0

我從來沒有做任何事情這個複雜Solr中,因此有可能在勾這是一個插件的方式 - 但你可以處理它客戶端返回結果集時。如果你按相關性排序,這應該是直截了當的 - 獲得第一個結果(最大)和最後一個(最小)的相關性。然後與相關X每一個結果,就可以計算出

normalisedValue = (x - min)/(max - min) 

,這將給你0和1之間的相乘的值由5輪拿到數星星。