我正在尝试通过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
完成,那就足够了
答案 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进行交互