2010-10-21 6 views
14

J'essaie de trouver comment améliorer la notation des résultats de recherche solr. Mon application doit prendre le score des résultats solr et afficher un certain nombre d '"étoiles" en fonction de la qualité du résultat de la requête. 5 étoiles = presque/exact jusqu'à 0 étoiles ce qui signifie que la recherche ne correspond pas très bien, p. un seul élément frappe. Cependant, je reçois des scores de 1,4 à 0,8660254 tous les deux retournent des résultats que je donnerais 5 étoiles à. Ce que je dois faire est en quelque sorte de transformer ces résultats en un pourcentage afin que je puisse marquer ces résultats, avec le nombre correct d'étoiles.comment normaliser un score solr/lucene?

La requête que je cours qui me donne le score 1.4 est:

euallowed: true ET (grade: "2: 1")

La requête qui me donne le score 0,8660254 est:

euallowed: true eT (grade: "2: 1" ou de grade: "1er")

Je l'ai déjà mis à jour la similarité de sorte que le rendement et tf idf 1.0 comme je ne suis intér si un document a un terme, pas le numéro de ce terme dans le document. C'est ce que mon code de similitude ressemble:

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

Je suppose que mes questions sont:

  1. Quelle est la meilleure façon de normaliser le score afin que je puisse travailler sur la façon beaucoup « étoiles "à donner?

  2. Existe-t-il un autre moyen de noter les résultats ?

Merci

Grant

Répondre

15

Pour citer http://wiki.apache.org/lucene-java/ScoresAsPercentages:

Les gens veulent souvent calculer un "pourcentage" de scores Lucene pour déterminer ce qui est un match "parfait à 100%" vs un match "50%". Ceci est aussi quelque chose appelé un "score normalisé"

Ne faites pas cela.

Sérieusement. Arrêtez d'essayer de penser à votre problème de cette façon, ça ne va pas se terminer bien.

Cette page donne un exemple de la façon dont vous pourriez théoriquement le faire, mais c'est très difficile.

+1

Humm ... merci pour cela. Cela fait un très bon argument, mais je ne suis pas sûr de ce qui se passe quand je remplace tf et idf. Je pense que je pourrais devoir regarder ceci d'une manière différente. Même si cela ne signifie pas "marquer" par les étoiles. –

0

Je ne l'ai jamais eu à rien faire compliqué Solr, donc il peut y avoir un moyen de brancher ce dans un plugin - mais vous pouvez le manipuler en le client lorsqu'un ensemble de résultats est renvoyé. Si vous avez trié par pertinence, cela devrait être simple - obtenir la pertinence du premier résultat (max), et le dernier (min). Ensuite, pour chaque résultat avec pertinence x, vous pouvez calculer

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

qui vous donnera une valeur comprise entre 0 et 1. Multiplier par 5 et rond pour obtenir le nombre d'étoiles.

0

On l'appelle le score normalisé (Scores As Percentages).

Vous pouvez utiliser les éléments suivants les paramètres suivants pour y parvenir:

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

Où 20 est votre seuil de 20%.

Voir aussi:

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