2011-12-30 19 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> 

然而,當我使用類似通過Solrnet查詢Solr的:

私人只讀ISolrReadOnlyOperations的Solr var results = solr.Query(SolrQuery.All);

我發現組件始終爲空。

任何幫助表示讚賞。

我可以看到任何派生集合的這種行爲。

+0

我有'string []'類型(數組而不是派生List類型)工作多值屬性。 – Matej 2011-12-30 08:19:21

+0

@Matej它適用於我的字符串[],但我不認爲我可以在這裏使用數組。派生List有其存在的理由。 – 2011-12-30 09:19:22

回答

1

您可以使用'proxy'屬性來執行此操作,如this answer中所述。或者,您可以爲您的組件類型編寫ISolrFieldParser/ISolrFieldSerializer

獨立於此,我同意將您的領域模型與索引模型分開通常是一個好主意。

+0

我嘗試了代理屬性方法,其中我有一個SolrField屬性,它是字符串數組和我的模型行爲的派生列表。但接下來我需要解決一個不同的野獸 - 這兩個屬性之間的關注分離。那時候我意識到我不應該使用Indexing特定邏輯來擴大我的領域模型。感謝您提供ISolrFieldSerializer的鏈接。在另一種情況下,我可能需要它。 – 2012-01-03 04:05:12

1

我想我找出了原因 - 當索引多值實體存儲爲數組,當它被反序列化時,它被轉換成一個ArrayList。因此,在我的情況下,派生List不能直接使用。

從中學到的教訓是,我需要將我的領域模型與我的索引模型分開 - 這在回顧過程中聽起來像是一種很好的做法。