2016-04-21 65 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

相關問題