Elasticsearch Nest 6将对象enabled = false反序列化为null

时间:2019-02-11 23:51:57

标签: elasticsearch nest

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#/嵌套查询:

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

1 个答案:

答案 0 :(得分:0)

我发布的问题确实有效。原来,我在C#属性“ MyDisabledField”上缺少“设置者”。所以我有:

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对象的工作符合您的预期