如何使用 Nest 从 Elasticsearch 获取仅包含某些字段的类型化 DTO?

How to Get a typed DTO with only some fields from Elasticsearch with Nest?

我正在尝试 Get 使用 NEST 1.7.1 来自 Elasticsearch 1.7.0 的结果。我的文档包含许多字段,但我只对其中一个感兴趣。我更希望获得表示部分文档的键入结果。

我正在按照以下代码使用一些东西:

var settings = new ConnectionSettings(new Uri(url)).SetDefaultIndex("MyIndex");
var client = new ElasticClient(settings);

var result = client.Get<MyDtoPartial>(g => g
    .Type("myDocType")
    .Id("abcdefg123456")
    .Fields("doc.subids")
);

MyDtoPartial 目前看起来是这样的:

public class MyDtoPartial
{
    [JsonProperty("doc.subids")]
    public IList<string> SubIds { get; set; }

    // Other properties of my documents are not mapped, in this
    // context I only want the SubIds.
}

在调试器中,我可以深入 result.Fields 并看到该字典中的第一个具有调试器按照以下行呈现的值:

{[doc.subids, [ "12354adsf-123fasd", "2134fa34a-213123" ...

我还可以看到发出的 Elasticsearch 请求,它是这样的:

http://myserver:12345/MyIndex/myDocType/abcdefg123456?fields=doc.subids    

而且returns这种json:

{
    "_index": "MyIndex",
    "_type": "myDocType",
    "_id": "abcdefg123456",
    "_version": 1,
    "found": true,
    "fields": {
        "doc.subids": ["12354adsf-123fasd",
        "2134fa34a-213123",
        "adfasdfew324-asd"]
     }
}

所以我感觉我的请求没问题,因为我期望的那种回应。

但是,我的目标是获得 MyDtoPartial 的实例,其中包含 SubIds 属性。但是,result 似乎不包含 MyDtoPartial.

类型的任何类型的 属性

我经历了the Nest Get docs,实际上导致了上面的代码。

什么是 Get 一个只有来自 Elastic with Nest 的一些字段的正确类型的单个文档?

如果你提到 .Fields(...)Source 将永远是 null。如果您删除 .Fields(...),那么 Source 应该是 MyDtoPartial 类型,并为您提供所需的结果。你仍然得到 Source 作为 null 的原因可能是因为在 myDocType 的映射中,_source 字段被禁用。通过执行 GET <index name>/_mapping/myDocType 检查 myDocType 的定义。如果 _source 被禁用,Nest 将无法在其对此类型的响应中为您提供 MyDtoPartial 的具体对象。

如果您启用了 _source 但只想获取字段的子集,那么您可以使用 source filtering 而不是 fields 来指定您想要哪些字段以及您需要哪些字段不想在响应中返回。

var result = client.Get<MyDtoPartial>(g => g
    .Type("myDocType")
    .Id("abcdefg123456")
    .SourceInclude("doc.subids")
);

现在 result.Source 将成为 MyDtoPartial 的对象,其中除 SubIds 之外的所有字段都将是 null 并且 SubIds 将具有预期值。