2011-12-30 2 views
1

У меня есть модель, подобную нижеSolrnet: не удалось получить многозначное поле из Solr

public class Product 
{ 
    [SolrUniqueKey("id")] 
    public int ID { get; set; } 
    [SolrField("storage")] 
    public string Storage { get; set; } 
    [SolrField("components")] 
    public Components Components { get; set; } 
} 

public class Components : List<string> 
{ 
    public Components() 
    {} 
    public Components(string[] components) 
    { 
     AddRange(components); 
    } 
} 

В моей schema.xml я карта поля как:

<field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="storage" type="string" indexed="true" stored="true" omitNorms="true"/> 
    <field name="components" type="text_ws" stored="true" multiValued="true" omitNorms="true"/> 

Я добавил список из 5 продуктов для индекса Solr. Если я запрос со страницы администратора Solr для «*», я получаю этот ответ документ для одного из результатов:

<doc> 
    <arr name="components"> 
    <str>blah1</str> 
    <str>blah2</str> 
    <str>blah3</str> 
    </arr> 
    <str name="id">0</str> 
    <str name="storage">foo</str> 
</doc> 

Однако, когда я запрашиваю Solr через Solrnet используя что-то вроде:

частных только для чтения ISolrReadOnlyOperations Solr var results = solr.Query (SolrQuery.All);

Я нахожу, что компоненты всегда равны нулю.

Любая помощь приветствуется.

Я вижу это поведение для любой производной коллекции.

+0

У меня есть многозначное свойство с 'string []' type (array вместо производного типа List). – Matej

+0

@Matej Это работает для меня со строкой [], однако я не думаю, что могу использовать массив здесь. У производного списка есть причины для его существования. –

ответ

1

Вы можете сделать это с помощью свойства «прокси», как описано в this answer. Или вы можете написать ISolrFieldParser/ISolrFieldSerializer для вашего типа компонентов.

Независимо от этого, я согласен с тем, что разделение вашей модели домена от индексной модели обычно является хорошей идеей.

+0

Я пробовал подход к свойствам прокси, где у меня есть свойство SolrField, которое представляет собой массив строки и мой производный список для поведения моих моделей. Но тогда мне нужно будет обратиться к другому зверю - разделению проблем между этими двумя свойствами. Именно тогда я понял, что я не должен раздувать мою модель домена с помощью специфической логики индексирования. Спасибо за ссылки на ISolrFieldSerializer. Мне может понадобиться это в другом случае. –

1

Я предполагаю, что выяснил причину - при индексировании многозначный объект хранится как массив, а при десериализации он преобразуется в ArrayList. Следовательно, в моем случае производный список нельзя использовать напрямую.

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

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