我正在尝试使用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"]}
}
它出了什么问题?
答案 0 :(得分:2)
这里的问题是通过强类型的流畅批量方法传递原始json。
您实际发送给elasticsearch的是
{"index":{"_index":"test1","_type":"string"}}
"{"a" : "abc","b": { "c": ["1","2"]}}"
这是不正确的。
很少有想法可以对此做些什么:
使用JObject
将正确的序列化对象发送到elasticsearch
descriptor.Index<JObject>(i => i
.Index(index)
.Type(type)
.Id(data["Id"].toString())
.Document(JObject.Parse(doc)));
利用.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());
希望它有所帮助。