使用NEST将List <object>插入Elasticsearch

时间:2016-09-17 12:29:21

标签: c# elasticsearch nest

我在运行时生成了许多不同的值集合,并希望将它们发送到ElasticSearch。我可以将它们表示为List<object>,或者如果真的不以任何其他方式工作,则为List<string>。但我找不到任何例子如何做到这一点。这是一个不起作用的代码示例。可能有很多错误,所以任何额外的指针都非常受欢迎。

  var client = new ElasticClient(new Uri("http://localhost:9200"));
            client.CreateIndex("testentry");
            var values = new List<object> {"StringValue", 123, DateTime.Now};
            var indexResponse = client.Index(values, descriptor => descriptor.Index("testentry"));
            Console.WriteLine(indexResponse.DebugInformation);

结果是:

Invalid NEST response built from a unsuccessful low level call on POST: /testentry/list%601
# Audit trail of this API call:
 - [1] BadResponse: Node: http://localhost:9200/ Took: 00:00:00.0600035
# ServerError: ServerError: 400Type: mapper_parsing_exception Reason: "failed to parse" CausedBy: "Type: not_x_content_exception Reason: "Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes""

[2016-09-17 14:16:20,955][DEBUG][action.index             ] [Gin Genie] failed to execute [index {[t
estentry][list`1][AVc4E3HaPglqpoLcosDo], source[_na_]}] on [[testentry][1]]
MapperParsingException[failed to parse]; nested: NotXContentException[Compressor detection can only
be called on some xcontent bytes or compressed xcontent bytes];
        at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:156)

我正在使用Elasticsearch.Net 2.4.3和NEST 2.4.3。

2 个答案:

答案 0 :(得分:3)

Arrays不支持多种数据类型。

您可以将所有值转换为字符串:

client.CreateIndex("testentry");
var values = new List<string> { "StringValue", "123", DateTime.Now.ToString() };
var indexResponse = client.Index(new { Values = values}, descriptor => descriptor.Index("testentry").Type("test"));

或指定值应编入索引的字段:

client.CreateIndex("testentry");
var values = new { Field1 = "StringValue", Field2 = 123, Field3 = DateTime.Now };
var indexResponse = client.Index(values, descriptor => descriptor.Index("testentry").Type("test"));

考虑使用IndexDescriptor指定文档的类型,或者为文档创建一个类。

答案 1 :(得分:2)

In addition to Henrik's answer,您还可以为remove()

中的值编制索引
Dictionary<string, object>

public class MyType { public MyType() { Values = new Dictionary<string, object>(); } public Dictionary<string, object> Values { get; private set; } } void Main() { var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var connectionSettings = new ConnectionSettings(pool); var client = new ElasticClient(connectionSettings); var myType = new MyType { Values = { { "value1", "StringValue" }, { "value2", 123 }, { "value3", DateTime.Now }, } }; client.Index(myType, i => i.Index("index-name")); } 将序列化为json对象,其属性名称与字典键匹配

Dictionary<string,object>

在Elasticsearch中,映射将推断为object type