在 .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?

如果您要映射的属性在对象图中处于相同的深度,那么您可以使用 DataMemberAttributePropertyNameAttribute 将字段映射到 POCO 上不同命名的属性。

如果属性处于不同的深度,这不是使用内置序列化程序可以轻松完成的事情。您可以拥有应用了属性的私有成员,序列化程序将反序列化 JSON 字段,以及具有所需名称的 public 属性。要反序列化的对象图的整体形状需要与 FooIndex 相同,但是例如映射 FooIndex.Bar.Baz 需要 FooStatus 的对象图深三层才能映射 Baz.

要使用 JSON.NET 和 System.Text.Json 等其他序列化程序,需要编写自定义 JsonConverter,依次读取每个 属性,然后分配值。这是一项相当大的工作量,并且需要在任何时候重新访问 FooStatus' 属性需要更改。