【问题标题】:NEST dotnet core elastic not properly indexingNEST dotnet core elastic 没有正确索引
【发布时间】:2019-12-02 00:52:48
【问题描述】:

我在使用 dot net core (v3 preview6) 中的 NEST 和弹性记录器时遇到问题。

我有一个日志类记录 data 属性,我希望它接受我扔给它的任何 json,从 API/路由的角度来看它工作正常,我可以填充属性,但是它不能正确传输到通过 NEST 进行弹性搜索。我尝试将其作为 JObject JToken 和 System.Text.Json.JsonElement 发送:

    public class Log
    {

        public System.DateTime timestamp { get; set; }
        public System.Text.Json.JsonElement data {get; set;}
    }

然后我使用我的弹性客户端:

var response = client.Index(log, idx => idx.Index("log"));

无论类型如何,我都无法在弹性搜索中将我的动态 json 转换为 json。我错过了什么?

【问题讨论】:

    标签: elasticsearch .net-core nest


    【解决方案1】:

    这里的问题是 NEST 6.x+(我将在这些示例中使用 NEST 7.1.0)不知道如何序列化 JObjectJTokenJsonElement,或者更准确地说,默认的内部序列化器不知道如何序列化它们。

    JObject为例

    public class Log
    {
        public DateTime timestamp { get; set; }
        public JObject data { get; set; }
    }
    

    并序列化

    var client = new ElasticClient();
    
    var log = new Log
    {
        timestamp = new DateTime(2019,7,25, 0,0,0, DateTimeKind.Utc),
        data = new JObject 
        {
            { "foo", "bar" },
            { "baz", new JArray(1, 2) },
        }
    };
    
    client.Index(log, i => i.Index("log"));
    

    产量

    POST http://localhost:9200/log/_doc
    {"timestamp":"2019-07-25T00:00:00Z","data":[[[]],[[[],[]]]]}
    

    "data" 被序列化为数组数组。 Json.NET 对JObject 进行了特殊处理以将其序列化为对象,但对于任何其他序列化程序,它将使用基于对象类型或对象实现的接口的约定,以及这些可能反映的顺序并下定决心。如果您想在 NEST 6.x 或 7.x 中使用JObject,可以使用NEST.JsonNetSerializer nuget packageconfigure it as the serializer for your POCOs。请注意,使用 JsonNetSerializer 会产生一些性能开销,但会牺牲灵活性。

    如果你不想走那条路,你可以在 NEST 7.x 中使用DynamicDictionary,这是一个支持动态访问的字典

    var client = new ElasticClient();
    
    var log = new Log
    {
        timestamp = new DateTime(2019,7,25, 0,0,0, DateTimeKind.Utc),
        data = new DynamicDictionary 
        {
            { "foo", new DynamicValue("bar") },
            { "baz", new DynamicValue(new [] { 1, 2 }) },
        }
    };
    
    client.Index(log, i => i.Index("log"));
    

    序列化为

    POST http://localhost:9200/log/_doc?pretty=true 
    {"timestamp":"2019-07-25T00:00:00Z","data":{"foo":"bar","baz":[1,2]}}
    

    【讨论】:

    • 谢谢,这正是我所缺少的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2021-06-21
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多