2010-10-21 16 views
14

Solr arama sonuçlarının skorlamasını nasıl geliştirebileceğimi araştırmaya çalışıyorum. Uygulamamın sonuçları solr sonuçlarından alması ve sonucun ne kadar iyi olduğuna bağlı olarak birkaç yıldız göstermesi gerekiyor. 5 Yıldızlı = neredeyse/tam olarak 0 yıldıza kadar, aramayı çok iyi eşleştirmeyecek şekilde, yani, sadece bir eleman vurur. Ancak, 1,4'ten 0.8660254'e kadar olan skorları aldığımda, her ikisine de 5 yıldız vereceğim sonuçlar geliyor. Yapmam gereken şey, bu sonuçları bir sayıya çevirmektir, böylece bu sonuçları doğru yıldız sayısıyla işaretleyebilirim.Bir solr/lucene skorunu nasıl normalleştiririm?

Bu da beni 1.4 puan verir çalıştırmak sorgu:

euallowed: true VE (dereceli: "2: 1")

bana 0,8660254 puan veren sorgu:

euallowed: true vE (dereceli: "2: 1" VEYA sınıf: "1") böylece zaten Benzerlik güncelledik

tf ve idf dönüş 1.0 Ben sadece interes olduğum gibi Belgede bir terim varsa, belgede o terimin sayısını değil. nasıl çok “

  1. nasıl skor normale en iyi yolunu bulmaya çalışabilir, böylece:

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

    Yani benim sorular burada varsayalım: Bu benim benzerlik kod neye benzediği yıldız vermek?

  2. sonuçlarını puanlamak için başka bir yolu var mı?

Teşekkür

Grant

cevap

15

http://wiki.apache.org/lucene-java/ScoresAsPercentages alıntı:

İnsanlar sıklıkla "% 50" maçı bir "% 100 mükemmel" maç olduğunu belirlemek için Lucene puanları bir "Yüzde" hesaplamak istiyorum. Bu, "normalleştirilmiş bir puan" olarak adlandırılan bir "normalize edilmiş puan" olarak adlandırılan bir şeydir. Bunu yapmayın.

Cidden. Problemini bu şekilde düşünmeyi bırak, iyi bitmeyecek.

Bu sayfa teoride nasıl yapabileceğinize dair bir örnek veriyor, ancak bu çok zor.

+1

Humm ... teşekkürler. Bu çok iyi bir argüman ama tf ve IDF geçersiz ne olur emin değilim yapar. Buna farklı bir şekilde bakmam gerektiğini düşünüyorum. Yıldızlar tarafından "puanlama" anlamına gelmese bile. –

0

Ben Solr bu karmaşık bir şey yapmak zorunda kalmamıştım, bu yüzden bir eklenti olarak bu kanca için bir yol olabilir - ama sen halledersin diye Bir sonuç kümesi döndüğünde istemci. Alaka düzeyine göre sıralarsanız, bu durum ileriye dönük olmalıdır - ilk sonucun (maks) ve son (min) alaka düzeyini elde edin. Sonra alaka x her bir sonuca ilişkin, yıldızların sayısını almak için 5 ile yuvarlak tarafından size 0 ile 1 Multiply arasında bir değer verecektir

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

hesaplayabilirsiniz.

0

Bu normalize puanı (Scores As Percentages) denir.

Bunu başarmak için aşağıdaki aşağıdaki parametreleri kullanabilirsiniz:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100) 
fq = {!frange l=20}$ns 

20% 20'lik eşiğidir.

Ayrıca bkz: Bunun için

Remove results below a certain score threshold in Solr/Lucene?

http://article.gmane.org/gmane.comp.jakarta.lucene.user/12076 http://article.gmane.org/gmane.comp.jakarta.lucene.user/10810