流畅的date_range映射,无需在POCO上定义Nest.DateRange属性

时间:2019-01-15 17:13:59

标签: elasticsearch nest

我正在尝试通过Nest客户端使用流畅的映射来映射到date_range字段,以进行Elasticsearch。当我将Nest.DateRange定义为POCO上的一个属性时,我知道该怎么做,如下所述。

带有Nest.DateRange的POCO

    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完成,那就足够了

1 个答案:

答案 0 :(得分:1)

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中的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进行交互