Как перезаписать поле документа Solr?

#solr

#solr

Вопрос:

 <arr name="itemDescSpell">
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str>
<str>Cable Tie, 4.0L (102mm), Miniature, Nyl</str>
</arr>
  

itemDescSpell copyField что вызывает ошибку, когда документ Solr обновляется каждый раз. Я не хочу создавать поле как multiValued="true"

в схеме copyField определяется следующим образом

 <field name="itemDescSpell" type="textSpell"/>
  <copyField source="description" dest="itemDescSpell"/>
  

Ошибка:

 multiple values encountered for non multiValued field itemDescSpell.
  

Кто-нибудь может помочь мне решить эту проблему с помощью SolrJ, сохранив при этом тип этого поля как textSpell ?

Комментарии:

1. Как определяется тип поля itemDescSpell в схеме?

Ответ №1:

Попробуйте использовать пользовательский UpdateRequestProcessor, чтобы перезаписать значение, присутствующее в поле itemDescSpell . Solr выдает исключение, которое вы получаете, когда назначение copyfield уже заполнено, поэтому вам нужно удалить строку copyField из вашей схемы и добавить в вашу конфигурацию пользовательский UpdateRequestProcessor, который может выглядеть следующим образом :

 public class CustomFactory extends UpdateRequestProcessorFactory {
    @Override
    public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) {
        return new Custom(next);
    }

    public class Custom extends UpdateRequestProcessor {

        public Custom(UpdateRequestProcessor next){
            super(next);
        }

        @Override
        public void processAdd(AddUpdateCommand cmd) throws IOException {
            cmd.solrDoc.setField("foo",cmd.solrDoc.getFieldValue("bar"));
        }
    }
}
  

Это НЕ готовый к производству код, но он должен дать вам представление о том, как должен выглядеть конечный код. Чтобы настроить значения полей, вы можете переопределить метод инициализации на заводе и передать их в конфигурации.

Основное отличие заключается в том, что solr использует addField при обнаружении copyField, а этот класс использует SetField

Комментарии:

1. Я решил это, я использовал solr версии 4.0, поэтому это вызвало проблему. Теперь я обновил его до версии 4.3. Это работает