【问题标题】:Elasticsearch Nest 6 deserializes object enabled=false as nullElasticsearch Nest 6 将对象 enabled=false 反序列化为 null
【发布时间】:2019-02-11 23:51:57
【问题描述】:

我的弹性索引中的一个字段总是被 Nest 反序列化为 null。我使用的索引具有以下结构:

"myIndex": {
    "myMapping": {
      "name": {default properties},
      "guid": {"type": "keyword"},
      "myDisabledField": {
        "type": "object",
        "enabled": false
      }
    }
 }

当我尝试使用 Nest 6.x 对此索引进行搜索时,它总是将“myDisabledField”返回为 null。但是,如果我在 kibana 中发出相同的请求,它会在 _source 中显示“myDisabledField”。例如 kibana 查询:

GET myIndex/_search
{
  "query": {
    "query_string": {
      "query": "sample query"
    }
  }
}

将返回以下内容:

{
  "hits": [
    { 
      "_index": "myIndex",
      "_source": {
        "name": "some_name",
        "guid": "some_guid",
        "myDisabledField": {
          "field1": "value1",
          "field2": "value2",
          ... etc
        }
      }
    }
  ]
}

但是,C#/Nest 查询:

var result = _elasticClient.Search<T>(
  s => s
  .Query(
    q => q
    .QueryString(
      qs => qs
      .Query("sample query")
    )
  )
);

return result.Documents.ToList();

返回类似:

[
  "MyObject": {
    "Name": "some_name",
    "Guid": "some_guid",
    "MyDisabledField": null
  }
]

在这种情况下,“MyObject”是我用来填充此索引的 POCO。如何让 Nest 用存储在 _source 中的数据填充“MyDisabledField”?是否需要某种设置来反序列化对象或设置为 enabled=false 的字段?

顺便说一下,我使用 DefaultMappingFor 连接设置映射到我的类型的正确索引。 This is the documentation on the enabled property I used

【问题讨论】:

  • 请您编辑您的问题以包含一个小而完整的示例来重现您所看到的内容吗?我可以想到一些可能的原因,所以一个完整的例子真的有助于快速排除这些原因
  • 感谢@RussCam。在我的问题中,我试图提供一个示例,简化并删除了细节。您能告诉我我缺少哪些对您有帮助的信息吗?
  • 感谢@RussCam。您询问更多信息让我意识到我没有发布我的模型。重新检查我的模型后,我意识到相关字段中缺少二传手。出于某种原因,我只是一直错过它。感谢您的帮助!
  • 很高兴你把它整理好了@PierceMason!

标签: elasticsearch nest


【解决方案1】:

我发布的问题确实有效。事实证明,我错过了“MyDisabledField”C# 属性上的“setter”。所以我有:

public class MyMapping{
  public string Name {get; set;}

  public string Guid {get; set;}

  public MyObject MyDisabledField {get; }
}

代替:

public class MyMapping{
  public string Name {get; set;}

  public string Guid {get; set;}

  public MyObject MyDisabledField {get; set;}
}

我只是瞎了一个下午。很抱歉浪费大家的时间。反序列化 enabled=false 对象可以正常工作

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多