Fluent date_range mapping without defining Nest.DateRange 属性 on POCO

Fluent date_range mapping without defining Nest.DateRange property on POCO

我正在尝试使用流畅的映射来映射到 date_range 字段以及用于 elasticsearch 的 Nest 客户端。当我在我的 POCO 上将 Nest.DateRange 定义为 属性 时,我了解如何执行此操作,如下所示。

POCO 与 Nest.DateRange

    public class MyEvent
    {
        public Nest.DateRange MyDateRange { get; set; }   
    }

关联映射

             .Map<MyEvent>(map => map
                 .AutoMap()
                 .Properties(properties => properties
                     .DateRange(dateRange => dateRange
                         .Name(name => name.MyDateRange)
                     )
                 )
             )

但是,如果不依赖 Nest.DateRange 作为我的 POCO

的一部分,我会实现同样的事情

相反,我希望从两个标​​准 DateTime 属性创建 date_range 映射

    public class MyEvent
    {
        public DateTime? StartUTC { get; set; }
        public DateTime? EndUTC { get; set; }
    }

高级客户端可以实现吗?

注意:理想情况下,我想从可为空的 DateTime? 属性映射,但这并不重要。如果只能用不可空的DateTime就可以了

6.x中的DateRange type

public class DateRange
{
    [JsonProperty("gt")]
    public DateTimeOffset? GreaterThan { get; set; }

    [JsonProperty("gte")]
    public DateTimeOffset? GreaterThanOrEqualTo { get; set; }

    [JsonProperty("lt")]
    public DateTimeOffset? LessThan { get; set; }

    [JsonProperty("lte")]
    public DateTimeOffset? LessThanOrEqualTo { get; set; }
}

所以要创建你自己的类型来做同样的事情,你可以使用 PropertNameAttribute(这仍然需要对 NEST 的依赖),或者使用 System.Runtime.Serialization[=16 中的 DataMemberAttribute =]

public class MyDateRange
{
    [DataMember(Name = "gt")]
    public DateTimeOffset? GreaterThan { get; set; }

    [DataMember(Name = "gte")]
    public DateTimeOffset? GreaterThanOrEqualTo { get; set; }

    [DataMember(Name = "lt")]
    public DateTimeOffset? LessThan { get; set; }

    [DataMember(Name = "lte")]
    public DateTimeOffset? LessThanOrEqualTo { get; set; }
}

并且您还需要显式映射它

private static void Main()
{
    var defaultIndex = "my_index";
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

    var settings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(settings);

    var createIndexResponse = client.CreateIndex(defaultIndex, c => c
        .Mappings(m => m
            .Map<MyDocument>(mm => mm
                // automap
                .AutoMap()
                // now override any auto inferred mappings
                .Properties(p => p
                    .DateRange(dr =>dr 
                        .Name(n => n.DateRange)
                    )
                )
            )
        )
    );

    client.IndexDocument(new MyDocument
    {
       DateRange = new MyDateRange
       {
           GreaterThan = DateTime.UtcNow.Date,
           LessThan = DateTime.UtcNow.Date.AddDays(1)
       }
    });
}

public class MyDocument
{
    public MyDateRange DateRange { get; set; }
}

但在我看来,您可能希望使用单独的 POCO 与 Elasticsearch 进行交互