Свободное отображение даты и диапазона без определения свойства Nest.DateRange в POCO - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь использовать свободное отображение для сопоставления с полем date_range с клиентом Nest для эластичного поиска. Я понимаю, как это сделать, когда я определяю Nest.DateRange как свойство в моем POCO, как это сделано ниже.

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

Вместо этого я хочу создать отображение date_range из двух стандартных свойств DateTime

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

Это достижимо с клиентом высокого уровня?

Примечание: в идеале я хотел бы отобразить из nullable DateTime? свойства, однако, это не критично. Если это можно сделать только с ненулевым значением DateTime, этого достаточно

1 Ответ

0 голосов
/ 16 января 2019

Тип DateRange в 6.x равен

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) или DataMemberAttribute из System.Runtime.Serialization

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

...