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

标签 elasticsearch nest

我正在尝试通过Nest客户端使用流畅的映射来映射到date_range字段,以进行Elasticsearch。当我将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的一部分,我将实现相同的目标

相反,我希望根据两个标准的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中的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进行交互

关于elasticsearch - 流畅的date_range映射,无需在POCO上定义Nest.DateRange属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54203790/

相关文章:

javascript - 服务器端elasticsearch过滤器

elasticsearch - Spring Data ElasticsearchCrudRepository 无法识别参数

elasticsearch - 如何使用MultiTermVectorsAsync

elasticsearch - 使用 NEST 5.0 索引动态对象

lucene - 在C#NEST中选择Lucene/Elastic Search荧光笔

ElasticSearch:使用多个加权函数进行排名;使用 random_score 时,其他功能将被忽略

elasticsearch - 查找所有 Elasticsearch 文档,其字段为数组

ElasticSearch - 使用缩写进行搜索

elasticsearch - 巢-重新编制索引

ruby-on-rails - Elasticsearch - '127.0.0.1:9200' 和 'localhost:9200' 无法在浏览器上连接