如何从带有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中的一些字段的正确类型的单个文档,正确的方法是什么?
如果您提到.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
将具有期望值。