2010-05-20 12 views
11

¿Hay funcionalidades integradas en solr/lucene para filtrar los resultados si están por debajo de un cierto umbral de puntuación? Digamos que si proporciono un umbral de puntuación de .2, todos los documentos con puntaje inferior a .2 se eliminarán de mis resultados. Mi intuición es que esto es posible actualizando/personalizando solr o lucene.¿Quitar los resultados por debajo de un cierto umbral de puntuación en Solr/Lucene?

¿Podría indicarme la dirección correcta sobre cómo hacer esto?

¡Gracias de antemano!

+3

La respuesta de Simon es correcta. Pero tenga en cuenta que los sociales son relativos y, por lo tanto, es difícil elegir un umbral para la "bondad" de los resultados. –

Respuesta

7

Puede escribir su propio recopilador que ignore la recopilación de los documentos que el anotador coloca por debajo de su umbral. A continuación se muestra un ejemplo simple de esto usando Lucene.Net 2.9.1.2 y C#. Tendrá que modificar el ejemplo si desea mantener el puntaje calculado.

using System; 
using System.Collections.Generic; 
using Lucene.Net.Index; 
using Lucene.Net.Search; 

public class ScoreLimitingCollector : Collector { 
    private readonly Single _lowerInclusiveScore; 
    private readonly List<Int32> _docIds = new List<Int32>(); 
    private Scorer _scorer; 
    private Int32 _docBase; 

    public IEnumerable<Int32> DocumentIds { 
     get { return _docIds; } 
    } 

    public ScoreLimitingCollector(Single lowerInclusiveScore) { 
     _lowerInclusiveScore = lowerInclusiveScore; 
    } 

    public override void SetScorer(Scorer scorer) { 
     _scorer = scorer; 
    } 

    public override void Collect(Int32 doc) { 
     var score = _scorer.Score(); 
     if (_lowerInclusiveScore <= score) 
      _docIds.Add(_docBase + doc); 
    } 

    public override void SetNextReader(IndexReader reader, Int32 docBase) { 
     _docBase = docBase; 
    } 

    public override bool AcceptsDocsOutOfOrder() { 
     return true; 
    } 
} 
+0

Gracias Simon. Esto realmente me dio una mejor comprensión sobre cómo implementarlo. @Shashikant - gracias también por compartir sus ideas. Lo tendré en mente. Seré más cauteloso al establecer el umbral para que haya pocas posibilidades de que filtre los resultados relevantes. – snickernet

4

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%.

relacionadas: how do I normalise a solr/lucene score?


no lo recomendaría hacer esto porque Resultado valores absolutos en Lucene no son significativos (por ejemplo, los resultados no son directamente comparables entre búsquedas). La relación de una puntuación a la puntuación más alta devuelta es significativa, pero no hay una calibración absoluta para la puntuación más alta devuelta, al menos en este momento, por lo que no hay forma de determinar a partir de las puntuaciones cuál es la calidad del resultado conjunto es general. Hay varios enfoques para mejorar esto que se han discutido (hacer los puntajes más directamente comparables codificando información adicional en el puntaje y usar eso para la normalización, o probablemente mejor, generalizando el puntaje a un objeto que contiene múltiples piezas de información, por ejemplo, el número total de términos de consulta que coinciden con el resultado superior si está utilizando el valor predeterminado O sería bastante útil). Ninguna de estas ideas están implementadas hasta donde yo sé. - @Chuck

Fuente: RE: Limiting Hits with a score threshold

relacionados: Re: A question about scoring function in Lucene

0

Apenas una actualización para cualquier persona que se topa aquí - un EarlyTerminatingSortCollector ha sido proporcionada por Lucene y un colector de encargo no necesita ser hecho para esto más. Envuélvalo sobre TopDocsCollector (en el caso específico de OP, TopScoreDocCollector) para lograr la tarea especificada.

EarlyTerminatingSortCollector

Un colector que termina temprano colección de documentos sobre una base por segmentos, si el segmento se clasifica según el tipo dado.

TopDocsCollector

Una clase base para todos los coleccionistas que devuelven una salida TopDocs. Este recopilador permite una extensión fácil al proporcionar un único constructor que acepta un PriorityQueue así como miembros protegidos para esa cola de prioridad y un contador del número total de visitas.

Cuestiones relacionadas