Solrnet:无法从Solr中检索多值字段

时间:2011-12-30 05:02:10

标签: c# solrnet

我有一个类似于下面的模型

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"/>

我已经向Solr索引添加了5个产品的列表。如果我从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>

然而,当我使用类似的东西通过Solrnet查询Solr时:

私人只读ISolrReadOnlyOperations solr var results = solr.Query(SolrQuery.All);

我发现组件始终为空。

感谢任何帮助。

我可以看到任何派生集合的这种行为。

2 个答案:

答案 0 :(得分:1)

我想我找出了原因 - 当索引时,多值实体存储为数组,并且在反序列化时,它会转换为ArrayList。因此,在我的情况下,派生的List不能直接使用。

我吸取的教训是,我需要将我的域模型与索引模型分开 - 回想起来,这听起来像是一种很好的做法。

答案 1 :(得分:1)

您可以使用'proxy'属性执行此操作,如this answer中所述。或者您可以为您的组件类型编写ISolrFieldParser / ISolrFieldSerializer

独立于此,我同意将您的域模型与索引模型分离通常是一个好主意。