【问题标题】:Insert List<object> into Elasticsearch with NEST使用 NEST 将 List<object> 插入 Elasticsearch
【发布时间】:2016-09-18 16:45:27
【问题描述】:

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

  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。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    In addition to Henrik's answer,您还可以索引Dictionary&lt;string, object&gt;中的值

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

    Dictionary&lt;string,object&gt; 将被序列化为一个 json 对象,其属性名称与字典键匹配

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

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

    【讨论】:

      【解决方案2】:

      不支持混合数据类型的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 指定文档的类型或为文档创建一个类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-17
        • 2022-08-10
        • 1970-01-01
        相关资源
        最近更新 更多