¿Cómo normalizo un puntaje solr / lucene?

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, 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:

  1. ¿Cuál es la mejor forma de normalizar el puntaje para poder calcular cuántas “estrellas” dar?

  2. ¿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

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.