2012-05-08 30 views
1

我正在使用SolrNet,並且在評分字段與在索引中添加或更新的文檔衝突時出現問題。與SolrNet一起使用評分字段

代表我的文檔類看起來是這樣的

class MyDoc 
{ 
    [SolrUniqueKey("doc_id")] 
    public string DocId { get; set; } 

    [SolrField("foo")] 
    public string Foo { get; set; } 

    [SolrField("bar")] 
    public string Bar { get; set; } 

    [SolrField("score")] 
    public double Score { get; set; } 
} 

在查詢被髮布到Solr,我已經添加了「分數」字段的fl參數,並返回,並設置分數值正確地在這個類上。但是,在添加或更新文檔時,我得到的關於不存在於我的索引中的分數字段的錯誤,它不會,因爲這是一個動態字段。

做添加/更新的代碼是相當簡單:

Startup.Container.GetInstance<ISolrOperations<MyDoc>>().Add(doc); 

它看起來像我需要的分數屬性由SolrNet(或SOLR)是被忽略添加或更新文檔時,只有使用它時,檢索文件。

有什麼辦法可以達到這個目的嗎?

回答

2

我已經完成了這兩個單獨的類。一個映射到從索引檢索的文檔作爲搜索結果以及另一個用於向索引添加項目的類。因此,在這種情況下,您可以執行以下操作:

class MyDoc 
{ 
     [SolrUniqueKey("doc_id")] 
     public string DocId { get; set; } 

     [SolrField("foo")] 
     public string Foo { get; set; } 

     [SolrField("bar")] 
     public string Bar { get; set; } 
} 


class MyDocResult 
{ 
     [SolrUniqueKey("doc_id")] 
     public string DocId { get; set; } 

     [SolrField("foo")] 
     public string Foo { get; set; } 

     [SolrField("bar")] 
     public string Bar { get; set; } 

     [SolrField("score")] 
     public double Score { get; set; } 
} 

確保您初始化指向同一個solr url的兩個類。 Startup.Init(「http:// localhost:8983/solr」); Startup.Init(「http:// localhost:8983/solr」);

然後你就可以添加具有:

ServiceLocator.Current.GetInstance<ISolrOperations<MyDoc>>().Add(doc); 

和查詢有:

var solr ServiceLocator.Current.GetInstance<ISolrOperations<MyDocResult>>(); 
    var results = solr.Query("foo bar"); 

你也可以考慮使用SolrNet的Dynamic or Fully Loose Mapping的選擇,如果你不想創建兩個單獨的類。

2

如果你讓你的POCO類有分數可爲空,你可以使用同一個對象的索引和結果

[SolrField("score")] 
public double? Score { get; set; } 
相關問題