2016-08-02 3 views
0

Я использую Solr 6.1 в режиме Schemaless. После создания коллекции и индексирования выборочных данных у всех созданных полей было установлено значение MultiValued = true, за исключением уникального идентификатора.Solr Schemaless Mode, создающий поля как MultiValued

Проблема заключается в том, что при запросе этих данных с помощью SolrNet он не будет правильно отображать результат в модель. Запрошенные результаты возвращаются в виде массива и требуют, чтобы все мои свойства в модели обновлялись до типа ICollection.

В любом случае мы можем установить для этого поля значение MultiValued = false при индексировании данных образца?

Пример для иллюстрации проблемы:

1) Индекс образец следующей модели в режиме Schemaless:

public class TestModel 
{ 
    [SolrUniqueKey("id")] 
    public int Id { get; set; } 

    [SolrField("guid")] 
    public Guid Guid { get; set; } 
} 

2) файл управляемой схемы Solr будет добавлен со следующими полями

<field name="guid" type="strings"/> 
    <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 

3) Ошибка при отображении поиска/модели

Object of type 'System.Collections.ArrayList' cannot be converted to type 
+0

Итак, вы спрашиваете, есть ли способ индексирования в режиме схематизации и почему-то все еще устанавливают одно поле, чтобы иметь только singleValue, правильно? – Mysterion

+0

Да, точно, я пытаюсь запустить Solr в схематическом режиме, но создание динамического поля создает все как многозначный тип. Это приводит к возникновению проблемы при сопоставлении результата с моделью без преобразования всех моих свойств в тип ICollection. –

ответ

4

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

Это легко настраивается, если вы хорошо знаете свой домен. Вся цепочка сопоставления определена в цепочке процессоров запроса запроса solrconfig.xml (add-unknown-fields-to-the-schema), и вы можете изменить сопоставление типов из многозначного типа на эквивалентный однозначный тип. Для строк вы изменяете значение в defaultFieldType.

+0

Спасибо Alex, это очень полезная информация, но если я определяю тип по умолчанию для одного типа значений, что произойдет, когда я попытаюсь индексировать многозначный тип массива? Другими словами, как это повлияет на регулярную работу по созданию поля? –

+0

Ну, если вы делали это вручную, как бы вы знали, должно ли каждое новое поле быть однозначным или многозначным? Является ли это по шаблону имени (и вы можете применить сопоставление для [только некоторых полей] (http://www.solr-start.com/javadoc/solr-lucene/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.html))? Знаете ли вы заранее об исключениях (например, в примере [отгруженных фильмов] (http://blog.outerthoughts.com/2015/11/oh-solr-home-where-art-thou/))? Вы хотите [сохранить только первый/последний элемент] (http://www.solr-start.com/info/update-request-processors/#FieldValueSubsetUpdateProcessorFactory)? –

+0

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