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 进行交互
我正在尝试使用流畅的映射来映射到 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 进行交互