2010-10-21 17 views
14

Estoy tratando de encontrar la forma de mejorar la puntuación de los resultados de búsqueda de solr. Mi aplicación necesita tomar el puntaje de los resultados de solr y mostrar un número de "estrellas" dependiendo de qué tan buenos son los resultados para la consulta. 5 estrellas = casi/exacto hasta 0 estrellas, lo que significa que no coinciden muy bien con la búsqueda, p. Ej. solo un elemento golpea. Sin embargo, estoy obteniendo puntajes de 1.4 a 0.8660254, ambos están arrojando resultados que le daría 5 estrellas. Lo que tengo que hacer es de alguna manera convertir estos resultados en un porcentaje para poder marcar estos resultados, con el número correcto de estrellas.¿cómo normalizo una puntuación solr/lucene?

La consulta que corro eso me da la puntuación 1.4 es:

euallowed: verdadero y (grado: "2: 1")

La consulta que me da la puntuación 0,8660254 es:

euallowed: verdadero y (grado: "2: 1" o grado: "primero")

ya he actualizado la similitud de forma que el TF y el retorno IDF 1.0 como yo soy más interes ted si un documento tiene un término, no el número de ese término en el documento. Esto es lo que se ve mi código de similitud como:

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

así que supongo que mis preguntas son:

  1. ¿Cómo es la mejor manera de normalizar la puntuación para que pueda encontrar la manera muchos “ estrellas "para dar?

  2. ¿Hay alguna otra manera de marcar los resultados ?

Gracias

subvención

Respuesta

15

Para citar http://wiki.apache.org/lucene-java/ScoresAsPercentages:

A menudo la gente quiere calcular un "porcentaje" de las puntuaciones de Lucene para determinar lo que es un "100% perfecto" partido contra un partido "50%". Esto también es algo llamado "puntaje normalizado"

No haga esto.

En serio. Deja de tratar de pensar en tu problema de esta manera, no va a terminar bien.

Esa página da un ejemplo de cómo se podría, en teoría, hacer esto, pero es muy difícil.

+1

Humm ... gracias por esto. Es un argumento muy bueno, pero no estoy seguro de lo que sucede cuando anulo tf e idf. Creo que debería ver esto de otra manera. Incluso si eso significa no "marcar" por las estrellas. –

0

nunca he tenido que hacer nada en este complicado Solr, por lo que puede ser una manera de conectar esto en forma de plugin - pero se puede manejar la situación en el cliente cuando se devuelve un conjunto de resultados. Si ha ordenado por relevancia, esto debería ser muy directo: obtenga la relevancia del primer resultado (máximo) y el último (mínimo). Luego, para cada resultado pertinente x, se puede calcular

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

que le dará un valor entre 0 y 1. Multiplicar por 5 y vueltas para obtener el número de estrellas.

0

Se llama puntuación normalizada (Scores As Percentages).

Puede utilizar los siguientes los siguientes parámetros para lograr que:

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

Donde 20 es el umbral del 20%.

Consulte también:

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

Cuestiones relacionadas