在 .NET 中进行源过滤后的 Elasticsearch 映射 DTO
Elasticsearch mapping DTO after source filtering in .NET
我有一个 POCO FooIndex
映射到 elasticsearch 中的一个索引,我想对该索引和 return 仅特定字段执行查询。我创建了一个 DTO FooStatus
,它只包含我 returning.
字段的属性
如果 DTO 中的 属性 名称与索引映射中的名称匹配,这会正常工作,正如预期的那样,但我希望某些属性具有不同的名称并将它们映射到索引字段。我该怎么做?
var searchDescriptor = new SearchDescriptor<FooIndex>()
.Index(index)
.Source(sf => sf
.Includes(i => i
.Fields(
f => f.FooId,
f => f.FirstName,
f => f.LastName,
f => f.PrimaryEmail,
f => f.UpdatedDate,
f => f.Statuses)))
.Query(q => q
.Bool(b => b
.Filter(f => f
.Terms(t => t
.Field(p => p.Statuses.Select(
x => x.blahId))
.Terms(reqIds)))));
var results = await _elasticClient.SearchAsync<FooStatus>(searchDescriptor);
return results.Documents;
public class FooStatus
{
public string FooId { get; set; }
public string FirstName {get; set;}
public string LastName {get; set; }
public string Email {get; set;} // Map this from FooIndex.PrimaryEmail
public DateTime? DateModified {get; set; } // Map this from FooIndex.UpdatedDate
public List<FooStatus> Statuses { get; set; }
}
I would like to have different names for some properties and map them to the index fields. How can I do this?
如果您要映射的属性在对象图中处于相同的深度,那么您可以使用 DataMemberAttribute
或 PropertyNameAttribute
将字段映射到 POCO 上不同命名的属性。
如果属性处于不同的深度,这不是使用内置序列化程序可以轻松完成的事情。您可以拥有应用了属性的私有成员,序列化程序将反序列化 JSON 字段,以及具有所需名称的 public 属性。要反序列化的对象图的整体形状需要与 FooIndex
相同,但是例如映射 FooIndex.Bar.Baz
需要 FooStatus
的对象图深三层才能映射 Baz
.
要使用 JSON.NET 和 System.Text.Json 等其他序列化程序,需要编写自定义 JsonConverter
,依次读取每个 属性,然后分配值。这是一项相当大的工作量,并且需要在任何时候重新访问 FooStatus
' 属性需要更改。
我有一个 POCO FooIndex
映射到 elasticsearch 中的一个索引,我想对该索引和 return 仅特定字段执行查询。我创建了一个 DTO FooStatus
,它只包含我 returning.
如果 DTO 中的 属性 名称与索引映射中的名称匹配,这会正常工作,正如预期的那样,但我希望某些属性具有不同的名称并将它们映射到索引字段。我该怎么做?
var searchDescriptor = new SearchDescriptor<FooIndex>()
.Index(index)
.Source(sf => sf
.Includes(i => i
.Fields(
f => f.FooId,
f => f.FirstName,
f => f.LastName,
f => f.PrimaryEmail,
f => f.UpdatedDate,
f => f.Statuses)))
.Query(q => q
.Bool(b => b
.Filter(f => f
.Terms(t => t
.Field(p => p.Statuses.Select(
x => x.blahId))
.Terms(reqIds)))));
var results = await _elasticClient.SearchAsync<FooStatus>(searchDescriptor);
return results.Documents;
public class FooStatus
{
public string FooId { get; set; }
public string FirstName {get; set;}
public string LastName {get; set; }
public string Email {get; set;} // Map this from FooIndex.PrimaryEmail
public DateTime? DateModified {get; set; } // Map this from FooIndex.UpdatedDate
public List<FooStatus> Statuses { get; set; }
}
I would like to have different names for some properties and map them to the index fields. How can I do this?
如果您要映射的属性在对象图中处于相同的深度,那么您可以使用 DataMemberAttribute
或 PropertyNameAttribute
将字段映射到 POCO 上不同命名的属性。
如果属性处于不同的深度,这不是使用内置序列化程序可以轻松完成的事情。您可以拥有应用了属性的私有成员,序列化程序将反序列化 JSON 字段,以及具有所需名称的 public 属性。要反序列化的对象图的整体形状需要与 FooIndex
相同,但是例如映射 FooIndex.Bar.Baz
需要 FooStatus
的对象图深三层才能映射 Baz
.
要使用 JSON.NET 和 System.Text.Json 等其他序列化程序,需要编写自定义 JsonConverter
,依次读取每个 属性,然后分配值。这是一项相当大的工作量,并且需要在任何时候重新访问 FooStatus
' 属性需要更改。