Solr返回400

时间:2012-10-07 22:40:11

标签: c# solr solrnet

这是对象模型。当我尝试将Product提交到Solr时,返回unknown field loca

public class Product
{
    [SolrUniqueKey("id")]
    public string Id { get; set; }

    [SolrField("manu")]
    public string Manufacturer { get; set; }

    [SolrField("cat")] // cat is a multiValued field
    public ICollection<string> Categories { get; set; }

    [SolrField("price")]
    public decimal Price { get; set; }

    [SolrField("inStock")]
    public bool InStock { get; set; }

    [SolrField("loca")]
    public Location Location { set; get; }
}

public class Location
{
    [SolrField("zipcode")]
    public int Zip { set; get; }
    [SolrField("country")]
    public string Country { set; get; }
}

嵌套类是否合法使用solr?

为什么没有存储?当我删除[SolrField("loca")]时,它可以正常工作。

你如何存储这些类?

1 个答案:

答案 0 :(得分:1)

您无法在Solr中执行嵌套类。因此,您需要将位置信息展平到Product类中。但是,您可以根据需要将数据映射到/取出Solr,从而在应用程序中将其表示为嵌套类。

例如,更新您的Solr架构以存储loca_zipcode和loca_country字段,然后将它们映射到新定义的SolrProduct类中,如下所示:

public class SolrProduct
{
    [SolrUniqueKey("id")]
    public string Id { get; set; }

    [SolrField("manu")]
    public string Manufacturer { get; set; }

    [SolrField("cat")] // cat is a multiValued field
    public ICollection<string> Categories { get; set; }

    [SolrField("price")]
    public decimal Price { get; set; }

    [SolrField("inStock")]
    public bool InStock { get; set; }

    [SolrField("loca_zip")]
    public int Zip { set; get; }

    [SolrField("loca_country")]
    public string Country { get; set; }
}

然后,您可以使用AutoMapper之类的内容将SolrProduct展平类映射到嵌套Product类的Location类。

另一种方法是在Solr中使用dynamic fields,在SolrNet中使用Dictionary进行动态映射支持。有关更多详细信息和示例,请参阅SolrNet wiki的SolrNet - Mapping部分。