【问题标题】:Elastic/NEST will not handle null valuesElastic/NEST 不会处理空值
【发布时间】:2018-05-05 00:32:29
【问题描述】:

我目前仅限于 NEST v2.4.6。

我的对象的属性有时可能为空,并且必须与这些空属性保持一致。

根据文档: https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/modifying-default-serializer.html#_modifying_settings_using_serializerfactory

这应该允许我序列化 Null 值。 不幸的是,一旦设置完成,我所有的 ElasticDB 查询都开始不返回任何内容。

当我放的时候这令人困惑

[JsonProperty(NullValueHandling = NullValueHandling.Include)]

属性,效果很好。

但我显然希望全局启用此功能。

这是我的实现的样子:

    var pool = new SingleNodeConnectionPool(new Uri(ConfigurationManager.AppSettings["ElasticInstanceAddress"]));
    var connection = new HttpConnection();
    var settings = new ConnectionSettings(pool, connection,
        new SerializerFactory((s, values) =>
    {
        s.NullValueHandling = NullValueHandling.Include;
    }));

在序列化程序上启用NullValueHandling 后突然开始不返回任何内容的示例 NEST 查询如下:

var dog = _client.Get<Dog>(query.DogName).Source;

有什么想法吗?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    为什么你的对象应该使用空值持久化?无论是否保留,当从 _source 反序列化回来时,该值应为 null,因为该字段要么丢失,要么实际设置为 null。无论如何,它应该默认工作。可以使用 Exists Query 来检查查询中的 null,请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-exists-query.html

    【讨论】:

    • 这是依赖于对象空值的遗留代码。我不需要检查空值。我需要能够序列化和反序列化空值。如 OP 中所述,在 JSON 序列化程序上设置 NullValueHandling.Include 选项仅在用作属性而不是通常的全局方式时才有效。如果我无法在设置到位的情况下首先反序列化任何内容,我认为存在查询与此处无关。
    • @Kyanite _source 上的 null 值将反序列化为类型上的 null 属性,除非您在反序列化中有一些特殊处理。最终结果是,当反序列化为 CLR 类型的实例时,_source 上的 null 属性和 _source 上的没有属性相同。您是否需要出于其他原因区分这些?
    • @Kyanite NEST 默认序列化和反序列化null 值。您正在通过传入 query.DogName 的 ID 获取文档,这听起来不正确。
    • @Kyanite 在 OP 中不清楚什么有效,什么无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多