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

Elasticsearch - MapperParsingException[Malformed content, must start with an object]

我正在尝试使用 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"]}
}

哪里出了问题?

这里的问题是通过强类型的流畅批量方法传递原始 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());
    

希望对您有所帮助。