0

这是我的文件:

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

如您所见,它继承自,Dictionary<string, object>因此我可以动态地向其添加字段(这是使聚合工作的要求)

我在这里存储映射:

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");

记录得到实际存储,但文本字段没有持久化。这是从 ElasticSearch 2.0 返回的 JSON

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

如果我从字段中删除基类MyDoctext正确存储但显然字典内容不是(我还需要删除该.Add()位,因为文档不继承自 a Dictionary)。

如何存储text字段和字典内容?

4

1 回答 1

1

抱歉,我在之前的帖子中写了错误的建议,所以我将其删除。我认为问题实际上在于序列化,因为您的基类是 Dictionary

我会做两件事首先尝试序列化您的对象以查看输出字符串我很确定文本被忽略。

其次,我会将课程改为以下

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"}
于 2016-03-02T11:32:17.910 回答