如何使用 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
将具有预期值。
我正在尝试 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
将具有预期值。