如何从带有Nest的Elasticsearch中获得只包含一些字段的类型化DTO

本文关键字:包含一 DTO 类型化 字段 Elasticsearch Nest | 更新日期: 2023-09-27 18:30:01

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

我正在使用与此代码类似的东西:

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    

它返回以下类型的json:

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

所以我觉得我的请求是可以的,因为是我期望的

但是,我的目标是获得一个具有完全填充的SubIds属性的MyDtoPartial实例。然而,result似乎不包含任何类型的MyDtoPartial属性。

我已经浏览了Nest Get文档,它实际上导致了上面的代码。

Get是一个只包含Elastic with Nest中的一些字段的正确类型的单个文档,正确的方法是什么?

如何从带有Nest的Elasticsearch中获得只包含一些字段的类型化DTO

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

如果启用了_source,但只想获取字段的子集,则可以使用源筛选而不是fields来指定您想要的字段和不希望在响应中返回的字段。

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

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