search - examples - solr near
¿Cómo normalizo un puntaje solr/lucene? (3)
Nunca tuve que hacer algo tan complicado en Solr, así que puede haber una manera de conectar esto como un complemento, pero podrías manejarlo en el cliente cuando se devuelva 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 con relevancia x, puede calcular
normalisedValue = (x - min) / (max - min)
que le dará un valor entre 0 y 1. Multiplique por 5 y por ronda para obtener el número de estrellas.
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 del 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, por ejemplo, solo golpea un elemento. 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.
La consulta que ejecuto que me da el puntaje 1.4 es:
euallowed: verdadero AND (grado: "2: 1")
La consulta que me da el puntaje 0.8660254 es:
euallowed: verdadero AND (grado: "2: 1" OR grado: "1 °")
Ya he actualizado la Similitud para que tf e idf devuelvan 1.0, ya que solo estoy interesado si un documento tiene un término, no el número de ese término en el documento. Así es como se ve mi código de similitud:
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;
}
}
Entonces, supongo que mis preguntas son:
¿Cuál es la mejor forma de normalizar el puntaje para poder calcular cuántas "estrellas" dar?
¿Hay alguna otra manera de anotar los resultados?
Gracias
Conceder
Para citar http://wiki.apache.org/lucene-java/ScoresAsPercentages :
Con frecuencia, las personas desean calcular un "Porcentaje" de las puntuaciones de Lucene para determinar qué es una coincidencia "100% perfecta" frente a una "50%". Esto también es llamado "puntaje normalizado"
No hagas esto
Seriamente. 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 podría, en teoría, hacer esto, pero es muy difícil.
Se llama puntuación normalizada ( puntajes como porcentajes ).
Puede usar los siguientes parámetros para lograr eso:
ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns
Donde 20 es su umbral de 20%.
Ver también:
¿Eliminar los resultados por debajo de un determinado umbral de puntuación en Solr / Lucene?
http://article.gmane.org/gmane.comp.jakarta.lucene.user/12076 http://article.gmane.org/gmane.comp.jakarta.lucene.user/10810