2010-05-20 11 views
11

Esiste una funzionalità incorporata in solr/lucene per filtrare i risultati se cadono al di sotto di una determinata soglia di punteggio? Diciamo che se fornisco una soglia di punteggio di 0,2, allora tutti i documenti con punteggio inferiore a 0,2 saranno rimossi dai miei risultati. La mia intuizione è che questo è possibile aggiornando/personalizzando solr o lucene.Rimuovere i risultati al di sotto di una determinata soglia di punteggio in Solr/Lucene?

Potrebbe indicarmi la giusta direzione su come farlo?

Grazie in anticipo!

+3

La risposta di Simon è corretta. Ma tieni presente che le socres sono relative e quindi è difficile scegliere una soglia per la "bontà" dei risultati. –

risposta

7

È possibile scrivere il proprio Collector che ignorerebbe la raccolta di quei documenti che l'indicatore posiziona sotto la soglia. Di seguito è riportato un semplice esempio di questo utilizzo di Lucene.Net 2.9.1.2 e C#. Dovrai modificare l'esempio se vuoi mantenere il punteggio calcolato.

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

Grazie Simone. Questo mi ha dato una comprensione molto migliore su come implementarlo. @Shashikant - grazie anche per condividere i tuoi pensieri. Lo terro 'a mente. Sarò più cauto nell'impostare la soglia in modo che ci siano poche possibilità di filtrare i risultati rilevanti. – snickernet

4

Si chiama punteggio normalizzato (Scores As Percentages).

È possibile utilizzare i seguenti i seguenti parametri per ottenere che:

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

Dove 20 è la soglia del 20%.

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


non mi consiglia di fare questo perché i valori di punteggio assoluto in Lucene non sono significativi (ad esempio, i punteggi non sono direttamente comparabili in tutta ricerche). Il rapporto tra punteggio e punteggio più alto restituito è significativo, ma non c'è una calibrazione assoluta per il punteggio più alto restituito, almeno attualmente, quindi non c'è un modo per determinare da i punteggi quale sia la qualità del risultato il set è nel complesso Ci sono vari approcci per migliorare ciò che è stato discusso (rendendo i punteggi più direttamente comparabili codificando ulteriori informazioni nello spartito e usando quello per la normalizzazione, o probabilmente meglio, generalizzando il punteggio a un oggetto che contiene più pezzi di informazioni, ad esempio il numero totale di termini di query corrispondenti al risultato superiore se si utilizza l'OR predefinito sarebbe abbastanza utile). Nessuna delle queste idee sono ancora implementate per quanto ne so. - @Chuck

Fonte: RE: Limiting Hits with a score threshold

Correlati: Re: A question about scoring function in Lucene

0

Solo un aggiornamento per tutti coloro che si imbatte qui - un EarlyTerminatingSortCollector è stato fornito da Lucene e un collettore personalizzato non ha bisogno di essere fatto per questo più. Avvolgere su TopDocsCollector (nel caso specifico dell'OP, TopScoreDocCollector) per ottenere l'attività specificata.

EarlyTerminatingSortCollector

un collezionista che termina in anticipo la raccolta di documenti su una base per segmenti, se il segmento è stato risolto in base alla data Sort.

TopDocsCollector

Una classe di base per tutti i collettori che restituiscono un'uscita TopDocs. Questo raccoglitore consente un'estensione semplice fornendo un singolo costruttore che accetta un PriorityQueue e membri protetti per quella coda di priorità e un contatore del numero di hit totali.

Problemi correlati