简体   繁体   English

插入清单 <object> 通过NEST进入Elasticsearch

[英]Insert List<object> into Elasticsearch with NEST

I have a lot of different collections of values I generate at runtime and want to send them to ElasticSearch. 我在运行时生成了很多不同的值集合,并希望将它们发送到ElasticSearch。 I can represent them as List<object> or if really doesn't work any other way, as List<string> . 我可以将它们表示为List<object>或者如果确实不能以其他任何方式表示,则可以表示为List<string> But I can't find any example how to do that. 但我找不到如何执行此操作的任何示例。 Here is an example of the code which doesn't work. 这是无效的代码示例。 There is probably a lot wrong with it, so any additional pointers are highly appreciated. 可能有很多错误,因此非常感谢其他指针。

  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);

Which results in: 结果是:

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

and

[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)

I'm using Elasticsearch.Net 2.4.3 and NEST 2.4.3. 我正在使用Elasticsearch.Net 2.4.3和NEST 2.4.3。

Arrays with a mixture of datatypes are not supported. 不支持混合使用数据类型的数组

You could convert all of the values to strings: 您可以将所有值转换为字符串:

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"));

Or specify the fields that the values should be indexed to: 或指定应将值建立索引的字段:

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

Consider specifying the type of the document with the IndexDescriptor or create a class for the document. 考虑使用IndexDescriptor指定文档的类型,或为文档创建一个类。

In addition to Henrik's answer , you could also index values in a Dictionary<string, object> 除了Henrik的答案 ,您还可以在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"));
}

The Dictionary<string,object> will be serialized to a json object with property names to match the dictionary keys Dictionary<string,object>将被序列化为具有属性名称以匹配字典键的json对象

{
  "values": {
    "value1": "StringValue",
    "value2": 123,
    "value3": "2016-09-18T18:41:48.7344837+10:00"
  }
}

Within Elasticsearch, the mapping will be inferred as an object type . 在Elasticsearch中,映射将被推断为对象类型

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM