2013-04-30 3 views
2

У меня есть индекс, но у него много мусорных данных. То, что я надеюсь достичь, - это система голосования, в которой больше голосов приравнивается к более высокому значению повышения. К сожалению, значения повышения не сохраняются обратно в индекс после того, как пользователь отправит голосование.Lucene.Net постоянные значения повышения

Это пробой кода для моей функции 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(); 
} 

ответ

0

Проблема в том, что вы не можете извлечь это значение из индекса. В извлеченном документе нет набора импульсов. Он сочетается с другими факторами индекса времени и кодируется в индексе таким образом, что его невозможно получить.

Решение, я думаю, было бы сохранить повышение как поле, хранящееся в индексе, и извлечь его и использовать для изменения и настройки повышения.

Что-то вдоль этих линий:

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

Я не ожидал, что большой обходной путь. Благодаря!! [Ссылка на документацию] (https://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/document/Document.html#getBoost()) –

Смежные вопросы