2015-10-25 3 views
1

Я использую Solr.NET для индексирования данных, а затем запрашиваю их на локальном сервере Solr (Solr.net v0.4, Solr v5.3.1) и получаю странное исключения.Однозначное поле, возвращаемое как многозначное значение из запроса

Моя проиндексированы запись является простой класс (упрощенный здесь):

public class Record 
{ 
    [SolrUniqueKey] 
    public long Id {get;set;} 

    [SolrUniqueKey] 
    public string Data {get;set;} 
} 

Что я добавляю к индексу, вызвав ISolrOperations.Add(). Я не определял схему заранее - она ​​была автогенерирована данными, которые я вложил.

В другом месте, я запрашиваю этот индекс, используя ISolrReadOnlyOperations.Query(), запрашивая только поле Id. Этот запрос, очевидно, возвращает результаты, но падает с ArgumentException:

«Не удалось преобразовать значение„System.Collections.ArrayList“в собственность„Id“документа типа My.Namespace.Record»

Это означает, что, сохраняя свойство Id как long, оно извлекается как ArrayList из longs. Я получаю ту же ошибку, если пытаюсь извлечь другие поля - я храню одну строку, но получаю их коллекцию. Это приводит к сбою, потому что он пытается создать экземпляр Record, где свойство Id является единственным long.

Просмотр индекса через веб-интерфейс показывает, что свойство действительно многозначное - JSON, который я вижу, содержит массив для всех свойств. Аналогично, в браузере схемы я вижу, что мои поля определены как многозначные (для свойств и схемы, а не для индексирования). В файле управляемой схемы индекса я вижу, что мои поля определены как strings (для строковых полей) или tlongs для числового поля.

  1. Почему Solr (или Solr.Net) индексирует мои однозначные поля как многозначные?
  2. Могу ли я предотвратить это без ручного редактирования схемы? Возможно, с помощью атрибута поля?
  3. Могу ли я получить только одно значение для многозначного свойства, поэтому, если я не смогу исправить схему, я могу просто извлечь данные в свой однозначный объект Record?
+0

Что такое определение поля в схеме? Схема - это то, что решает, возвращается ли поле как multiValued или нет (и нет, это невозможно переопределить с клиентской стороны). – MatsLindh

+0

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

ответ

3

Я нашел и решение, и обходное решение.

  1. Новые указатели/ядра в Solr 5.3.1, если не дано файл solrconfig.xml явно скопировать файл по умолчанию найденный в <solr dir>\server\solr\configsets\data_driven_schema_configs\conf. Этот файл определяет updateProcessRequestChain, определяющий, что происходит, когда новые документы добавляются без схемы. По умолчанию, типы определены здесь многозначны:

    <processor class="solr.AddSchemaFieldsUpdateProcessorFactory"> <str name="defaultFieldType">strings</str> <lst name="typeMapping"> <str name="valueClass">java.lang.Long</str> <str name="valueClass">java.lang.Integer</str> <str name="fieldType">tlongs</str> </lst> </processor>

Обратите внимание на strings и tlongs типов данных. Чтобы предотвратить это, вы можете изменить solrconfig.xml в папке conf вашего ядра, чтобы использовать однозначные типы данных (string, tlong и т. Д.) Или изменить значение по умолчанию для вновь созданных ядер.

  1. Обходным способом является чтение результатов как Dictionary<string,object>, вместо того, чтобы Solr.NET автоматически десериализовывал результаты в объект документа.

Это означает, что инициализация второй операции Solr объект для этого типа:

Startup.Init<Record>(indexUrl); // Typed 
    Startup.Init<Dictionary<string, object>>(indexUrl); // Untyped. 

и позже получить экземпляр ISolrOperations<Dictionary<string,object>> и вручную читать мои Key и Data атрибуты из него, бросая object полезную нагрузку ArrayList и извлечение значения.

+0

Вы случайно не знаете, что можно сделать для струн? Должен ли я добавить: ' java.lang.String java.lang.String строка ' там? : ^) – user2173353

+0

изменение tlongs, строк и т. Д., Строка в порядке, но для моего случая схема смешана: есть несколько полей, которые на самом деле многозначны, а некоторые однозначны. Что можно обойти/решить? – Nripendra