在索引时我以这种方式提升某些文件:
if (myCondition)
{
document.SetBoost(1.2f);
}
但是在搜索时间文件中具有完全相同的质量,但是一些传递和一些失败的myCondition都会得到相同的分数。
这是搜索代码:
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);
你能告诉我我需要做些什么才能获得提升的文件以获得更高的分数?
非常感谢!
答案 0 :(得分:6)
Lucene使用SmallFloat #flootToByte315方法对单个字节进行加速编码(尽管浮点数通常在四个字节上编码)。因此,将字节转换回float时,精度可能会大大降低。
在你的情况下,SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.2f))
返回1f,因为1f和1.2f彼此太靠近了。尝试使用更大的提升,以便您的文档获得不同的分数。 (例如1.25,SmallFloat.byte315ToFloat(SmallFloat.floatToByte315(1.25f))
给出1.25f。)
答案 1 :(得分:2)
以下是请求的测试程序,该程序太长而无法在评论中发布。
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());
}
}
}