2011-10-26 10 views
6

Al momento indice sto aumentando determinato documento in questo modo:In Lucene, perché i miei documenti potenziati e non caricati hanno lo stesso punteggio?

if (myCondition) 
{ 
    document.SetBoost(1.2f); 
} 

ma a ricerca di documenti in tempo con tutte le stesse identiche caratteristiche ma alcuni di passaggio e alcuni myCondition mancanza di tutti finiscono per avere lo stesso punteggio.

E qui è il codice di ricerca:

BooleanQuery booleanQuery = new BooleanQuery(); 
booleanQuery.Add(new TermQuery(new Term(FieldNames.HAS_PHOTO, "y")), BooleanClause.Occur.MUST); 
booleanQuery.Add(new TermQuery(new Term(FieldNames.AUTHOR_TYPE, AuthorTypes.BLOGGER)), BooleanClause.Occur.MUST_NOT); 
indexSearcher.Search(booleanQuery, 10); 

Potete dirmi quello che devo fare per ottenere i documenti che sono stati alimentati per ottenere un punteggio più alto?

Molte grazie!

+0

Vorrei raccomandare di pubblicare un codice minimale che mostri "I index in questo modo, cerca in questo modo e questo non funziona" (codice di lavoro senza lasciare nulla all'immagine del lettore). –

+0

Non sono certo un esperto, ma dovresti provare a caricare il tuo indice in Luke e controllare i valori di boost per ogni documento. Prova anche a controllare il risultato del metodo Explain() per vedere quale tipo di query viene eseguita. La mia ipotesi è che sia una domanda costante. Dai documenti di Lucene: "Una query che racchiude un'altra query o un filtro e restituisce semplicemente un punteggio costante uguale alla query boost per ogni documento che corrisponde al filtro o alla query. Per le query, quindi, semplicemente strisce di tutti i punteggi e restituisce una costante ". Non sono sicuro su come prevenirlo, ma sembra che questa query ignori il punteggio. – goalie7960

+0

@ goalie7960 puoi pubblicare un link alla pagina a cui fai riferimento dai documenti. Questo è l'indizio di cui ho bisogno. – Barka

risposta

6

Lucene codifica aumenta su un singolo byte (anche se un galleggiante è generalmente codificato su quattro byte) utilizzando il metodo SmallFloat # floatToByte315. Di conseguenza, ci può essere una grande perdita di precisione durante la conversione del byte in un float.

Nel tuo caso SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.2f)) rendimenti 1f perché 1f e 1.2f sono troppo vicini l'uno all'altro. Prova a utilizzare una spinta maggiore in modo che i tuoi documenti ottengano punteggi diversi. (Ad esempio 1.25, SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.25f)) dà 1,25f.)

2

Ecco il programma di test richiesto che era troppo lungo per pubblicare in un commento.

class Program 
{ 
    static void Main(string[] args) 
    { 
     RAMDirectory dir = new RAMDirectory(); 
     IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer()); 

     const string FIELD = "name"; 

     for (int i = 0; i < 10; i++) 
     { 
      StringBuilder notes = new StringBuilder(); 
      notes.AppendLine("This is a note 123 - " + i); 

      string text = notes.ToString(); 

      Document doc = new Document(); 
      var field = new Field(FIELD, text, Field.Store.YES, Field.Index.NOT_ANALYZED); 

      if (i % 2 == 0) 
      { 
       field.SetBoost(1.5f); 
       doc.SetBoost(1.5f); 
      } 
      else 
      { 
       field.SetBoost(0.1f); 
       doc.SetBoost(0.1f); 
      } 

      doc.Add(field); 
      writer.AddDocument(doc); 
     } 

     writer.Commit(); 

     //string TERM = QueryParser.Escape("*+*"); 
     string TERM = "T"; 

     IndexSearcher searcher = new IndexSearcher(dir); 
     Query query = new PrefixQuery(new Term(FIELD, TERM)); 
     var hits = searcher.Search(query);    
     int count = hits.Length(); 

     Console.WriteLine("Hits - {0}", count); 

     for (int i = 0; i < count; i++) 
     { 
      var doc = hits.Doc(i); 
      Console.WriteLine(doc.ToString()); 

      var explain = searcher.Explain(query, i); 
      Console.WriteLine(explain.ToString()); 
     } 
    } 
} 
Problemi correlati