2016-03-02 50 views
0

這是我的文檔:NEST 2.0不堅持某些字段到ElasticSearch 2.0

[ElasticsearchType(Name = "MyDoc")] 
public class MyDoc: Dictionary<string, object> 
{ 
    [String(Store = false, Index = FieldIndexOption.NotAnalyzed)] 
    public string text { get; set; } 
} 

正如你所看到的,它繼承Dictionary<string, object>,所以我可以場dinamically添加到它(這是作出要求聚合工作)

我在這裏存儲的映射:

client.Map<MyDoc>(m => m.Index("myindexname").AutoMap()); 

現在我創建一個新的記錄,並將其存儲:

var rec= new MyDoc(); 
rec.Add("id", "mystuff"); 
rec.text = "mytext"; 
client.Index(rec, i => i.Index("myindexname")); 
client.Refresh("myindexname"); 

該記錄實際存儲但文本字段未被保留。在這裏,JSON從ElasticSearch 2.0

{ 
"_index": "myindexname", 
"_type": "MyDoc", 
"_id": "AVM3B2dlrjN2fcJKmw_z", 
"_version": 1, 
"_score": 1, 
"_source": { 
"id": "mystuff" 
} 
} 

如果我刪除從MyDoctext場被正確地存儲,但很明顯的詞典內容不是基類(我還需要爲文件沒有刪除.Add()位繼承自Dictionary)。

如何同時存儲text字段和字典內容?

回答

1

對不起,我在我以前的帖子中寫錯了建議,所以我刪除了它。 我認爲問題實際上是序列化,因爲你的基類是字典

我會做兩件事先嚐試序列化你的對象看到輸出字符串我非常肯定,文本被忽略。

其次,我會改變類以下

public class MyDoc : Dictionary<string, object> 
    { 
     public string text 
     { 
      get 
      { 
       object mytext; 
       return TryGetValue("text", out mytext) ? mytext.ToString() : null; 
      } 
      set { this.Add("text", value);} 
     } 
    } 

PS。由於我認爲問題是在C#方面,因爲你從字典繼承,

var rec = new MyDoc(); 
rec.Add("id", "mystuff"); 
rec.text = "mytext"; 
//Text2 is property   public string text2 { get; set; } 
rec.text2 = "mytext2"; 
var test = JsonConvert.SerializeObject(rec); //{"id":"mystuff","text":"mytext"} 
+0

謝謝。看起來像一個使用字典存儲文本的包裝器。沒關係,但我一直在尋找正常字段未存儲的原因。必須可以存儲正常字段和字典內容 –

+0

因爲您正在從字典繼承。 –

+0

好吧,但爲什麼如果我從字典繼承其他領域被忽略。這是一個基本規則硬連接到elasticsearch或什麼? –