2016-04-21 43 views
0

我想批量索引文件到ES中使用BulkDescriptor在C#中。我正在使用V1.7 ES。以下是我的一段代码,Elasticsearch - MapperParsingException [格式错误的内容,必须以对象开始]

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"]} 
} 

出了什么问题在里面?

+0

您使用的是哪个版本的NEST? – Rob

+0

HI @Rob,它是v 1.7.1.0 – Backtrack

回答

2

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

什么你实际上是发送给elasticsearch是

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

这是不正确的。

一些想法,你可以做这个:

  1. 使用JObject发送正确序列化对象elasticsearch使用.Raw客户端发送原始JSON

    descriptor.Index<JObject>(i => i 
        .Index(index) 
        .Type(type) 
        .Id(data["Id"].toString()) 
        .Document(JObject.Parse(doc))); 
    
  2. 乘虚而入

    var json = new StringBuilder(); 
    json.AppendLine(@"{""index"":{""_index"":""indexName"",""_type"":""typeName""}}"); 
    json.AppendLine(@"{""a"" : ""abc"",""b"": { ""c"": [""1"",""2""]}}"); 
    
    _Client.Raw.Bulk(json2.ToString()); 
    

希望它有帮助。

+0

是的,它为我工作。最初我使用Raw,但是我不知道如何设置_id值。有什么方法可以在RAW中设置_id。 – Backtrack

+0

这应该工作'“{”“index”“:{”“_ index”“:”“indexName”“,”“_ type”“:”“typeName”“,”“_id”:“”1“”}} “'。 – Rob

+0

宝石,为我工作感谢 – Backtrack

相关问题