Elasticsearch - MapperParsingException [格式错误的内容,必须以对象开头]

时间:2016-04-21 12:57:34

标签: c# elasticsearch nest

我正在尝试使用C#中的BulkDescriptor将文档批量索引到ES中。我正在使用V1.7 ES。以下是我的代码,

 public IBulkResponse IndexBulk(string index, string type, List<string> documents)
        {

                BulkDescriptor descriptor = new BulkDescriptor();
                foreach (var doc in documents)
                {
                    JObject data = JObject.Parse(documents); 

                    descriptor.Index<object>(i => i
                        .Index(index)
                        .Type(type)
                        .Id(data["Id"].toString())
                        .Document(doc));
                }
                return  _Client.Bulk(descriptor);

        }

但它没有插入文件,当我验证回复后,我看到了以下消息MapperParsingException[Malformed content, must start with an object]

示例JSON文档

{
"a" : "abc",
"b": { "c": ["1","2"]}
}

它出了什么问题?

1 个答案:

答案 0 :(得分:2)

这里的问题是通过强类型的流畅批量方法传递原始json。

您实际发送给elasticsearch的是

{"index":{"_index":"test1","_type":"string"}}
"{"a" : "abc","b": { "c": ["1","2"]}}"

这是不正确的。

很少有想法可以对此做些什么:

  1. 使用JObject将正确的序列化对象发送到elasticsearch

    descriptor.Index<JObject>(i => i
        .Index(index)
        .Type(type)
        .Id(data["Id"].toString())
        .Document(JObject.Parse(doc)));
    
  2. 利用.Raw客户端发送原始json

    var json = new StringBuilder();
    json.AppendLine(@"{""index"":{""_index"":""indexName"",""_type"":""typeName""}}");
    json.AppendLine(@"{""a"" : ""abc"",""b"": { ""c"": [""1"",""2""]}}");
    
    _Client.Raw.Bulk(json2.ToString());
    
  3. 希望它有所帮助。