2

我创建了一个索引,但它有很多垃圾数据。我希望完成的是一个投票系统,其中更多的选票等于更高的提升值。不幸的是,用户提交投票后,提升值不会保存回索引中。

这是我的 Boost 函数的代码细分,有人对我做错了什么有任何想法吗?我使用了 explain(),但它没有任何与提升值相关的内容。

BoostUp(int documentId)
{


    IndexSearcher searcher = new IndexSearcher(dir);

    Document oldDoc = search.doc(documentId);
    //get all the stored information from old document

    Document updatedDocument = new Document();
    //Add fields containing data from old document.

    updatedDocument.Boost = oldDoc.Boost * 1.5F;

    IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), false, MaxFieldLength.LIMITED);

    Term uniqueTerm = new term("content_id", content_id_from_old_document);

    writer.UpdateDocument(uniqueTerm, updatedDocument);
    writer.Commit();
    writer.Dispose();
}
4

1 回答 1

0

问题是您无法从索引中检索该值。检索到的文档没有提升集。它与其他索引时间评分因素相结合,并在索引中编码,因此无法检索它。

我认为解决方案是将 boost 保存为存储在索引中的字段,然后检索它,并使用它来修改和设置 boost。

这些方面的东西:

Field boostField = oldDoc.getField("saved_boost");
float newBoost = boostField.numericValue().floatValue() * 1.5F;
updatedDocument.setBoost(newBoost);
updatedDocument.removeField("saved_boost");
NumericField boostField = new NumericField("saved_boost",Field.Store.YES,false);
boostField.setFloatValue(newBoost);
updatedDocument.add(boostField);

//No changes from here on...

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), false, MaxFieldLength.LIMITED);

Term uniqueTerm = new term("content_id", content_id_from_old_document);

writer.UpdateDocument(uniqueTerm, updatedDocument);
于 2013-04-30T15:31:23.360 回答