2015-01-23 3 views
0

Как упоминалось в руководстве по миграции lucene, чтобы установить повышение уровня документа, мы должны умножить все поля на повышение, повысив значение. Вот мой код:Ошибка lucene в поле документа setBoost

StringField nameField = new StringField("name", name, Field.Store.YES) ; 
    StringField linkField = new StringField("link", link, Field.Store.YES); 
    Field descField; 
    TextField reviewsField = new TextField("reviews", reviews_str, Field.Store.YES); 
    TextField authorsField = new TextField("authors", authors_str, Field.Store.YES);   
    FloatField scoreField = new FloatField("score", origScore,Field.Store.YES); 
    if (desc != null) { 
     descField = new TextField("desc", desc, Field.Store.YES); 
    } else { 
     descField = new TextField("desc", "", Field.Store.YES); 
    } 


    doc.add(nameField); 
    doc.add(linkField); 
    doc.add(descField); 
    doc.add(reviewsField); 
    doc.add(authorsField); 
    doc.add(scoreField); 


    nameField.setBoost(score); 
    linkField.setBoost(score); 
    descField.setBoost(score); 
    reviewsField.setBoost(score); 
    authorsField.setBoost(score); 
    scoreField.setBoost(score); 

, но я получил это исключение при запуске кода:

Exception in thread "main" java.lang.IllegalArgumentException: You cannot set an index-time boost on an unindexed field, or one that omits norms 

Я искал Google. но у меня нет ответов. не могли бы вы мне помочь?

ответ

2

Индексные повышения времени сохраняются в норме поля, и как StringField, так и FloatField опускают нормы по умолчанию. Таким образом, вам нужно включить их, прежде чем устанавливать усиление.

Чтобы включить нормы, вы должны будете определить свои собственные типы полей:

//Start with a copy of the standard field type 
FieldType myStringType = new FieldType(StringField.TYPE_STORED); 
myStringType.setOmitNorms(false); 
//StringField doesn't do anything special except have a customized fieldtype, so just use Field. 
Field nameField = new Field("name", name, myStringType); 

FieldType myFloatType = new FieldType(FloatField.TYPE_STORED); 
myFloatType.setOmitNorms(false); 
//For FloatField, use the appropriate FloatField ctor, instead of Field (similar for other numerics) 
Field scoreField = new FloatField("score", origScore, myFloatType); 
+0

Я получил сообщение об ошибке, что это FieldType заморожен, и я не могу изменить его. –

+0

@MohammadRazeghi Правильно, да, я поменял его на что-то, что на самом деле будет работать сейчас. – femtoRgon

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