2011-10-26 10 views
6

Dizin saatinde şu şekilde bir belgeyi destekliyorum:Lucene'de, neden güçlendirilmiş ve yüklenmemiş belgelerim aynı puanı alıyor?

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

Ancak arama süresi belgelerinde tümüyle aynı niteliklere sahip ama bazı geçişler ve bazı başarısız myCondition hepsi aynı puanı alıyor.

Ve şu sitedeki arama kodları:

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); 

Daha yüksek puanlar almak için desteklediğim belgeleri almak için ne yapmam gerektiğini söyleyebilir misiniz?

Çok teşekkürler!

+0

"Bu şekilde indekslediğim, bu şekilde arama yaptığım ve bu işlemin çalışmadığı" (kodun okuyucunun hayal gücüne bir şey bırakmadan çalışma kodu) olduğunu gösteren minimum bir kod göndermenizi tavsiye ederim. –

+0

Kesinlikle uzman değilim, ancak indeksinizi Luke'a yüklemeyi ve her bir belge için yükseltme değerlerini kontrol etmeyi denemelisiniz. Ayrıca, ne tür bir sorgu yürütülmekte olduğunu görmek için Explain() yöntem sonucunu da kontrol etmeyi deneyin. Benim tahminim bir ConstantScoreQuery. Lucene belgelerinden: "Başka bir sorguyu veya filtreyi saran ve filtreyle veya sorguyla eşleşen her belge için sorgu artırmaya eşit bir sabit puan döndüren bir sorgu. Bu nedenle, sorgular için tüm puanların şeritleri çıkarılır ve sabit bir değer döndürür. ." Bunu nasıl önleyeceğimi bilmiyorum, ama bu sorgu puanlamayı göz ardı ediyor gibi görünüyor. – goalie7960

+0

@ goalie7960, dokümanlardan başvuru yaptığınız sayfaya bir bağlantı gönderebilir. İhtiyacım olan ipucu o. – Barka

cevap

6

Lucene SmallFloat # floatToByte315 yöntemi kullanılarak (bir şamandıra genellikle dört bayt üzerinde kodlanan rağmen) tek bir bayt artırır kodlar. Sonuç olarak, baytı bir float'a dönüştürürken büyük bir hassasiyet kaybı olabilir.

Sizin durumunuzda SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.2f)), 1f ve 1.2f birbirine çok yakın olduğu için 1f döndürür. Belgelerinizin farklı puanlar alması için daha büyük bir destek kullanmayı deneyin. (Örneğin, 1.25, SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.25f)), 1.25f değerini verir.)

2

Bir yorumda göndermek için çok uzun süren istenen test programı.

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()); 
     } 
    } 
}