我正在尝试通过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/