为 elasticsearch 日期字段提供空值
Providing null value for elasticsearch date field
我只是想知道是否有人知道如何为 elasticsearch 日期字段提供空值。
您可以在下面的屏幕截图中看到,可以将 DateTime 用作空值,但是当我尝试时它不接受它。生成错误消息:
"'NullValue' 不是有效的命名属性参数,因为它不是有效的属性参数类型。"
只是使用了以下代码而不是在 class 日期属性上声明它:
.Properties(pr => pr
.Date(dt => dt
.Name(n => n.dateOfBirth)
.NullValue(new DateTime(0001, 01, 01))))
因为 DateAttribute
的 NullValue
是 DateTime
,所以不能在应用于 POCO 属性 的属性上设置它,因为设置值需要是一个编译时间常数。这是使用属性方法进行映射的限制之一。
NullValue
可以通过几种方式设置:
使用流畅API
流畅映射可以完成属性映射可以做的所有事情,还可以处理空值、multi_fields 等功能
public class MyDocument
{
public DateTime DateOfBirth { get; set; }
}
var fluentMappingResponse = client.Map<MyDocument>(m => m
.Index("index-name")
.AutoMap()
.Properties(p => p
.Date(d => d
.Name(n => n.DateOfBirth)
.NullValue(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))
)
)
);
使用访客模式
定义一个将访问POCO中所有属性的访问者,并使用它来设置一个空值。访问者模式对于将约定应用于您的映射很有用,例如,所有字符串属性都应该是一个 multi_field 和一个未分析的原始子字段。
public class MyPropertyVisitor : NoopPropertyVisitor
{
public override void Visit(IDateProperty type, PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute)
{
if (propertyInfo.DeclaringType == typeof(MyDocument) &&
propertyInfo.Name == nameof(MyDocument.DateOfBirth))
{
type.NullValue = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
}
}
}
var visitorMappingResponse = client.Map<MyDocument>(m => m
.Index("index-name")
.AutoMap(new MyPropertyVisitor())
);
fluent mapping和visitor都会产生如下请求
{
"properties": {
"dateOfBirth": {
"null_value": "1970-01-01T00:00:00Z",
"type": "date"
}
}
}
Take a look at the automapping documentation for more information.
我只是想知道是否有人知道如何为 elasticsearch 日期字段提供空值。
您可以在下面的屏幕截图中看到,可以将 DateTime 用作空值,但是当我尝试时它不接受它。生成错误消息:
"'NullValue' 不是有效的命名属性参数,因为它不是有效的属性参数类型。"
只是使用了以下代码而不是在 class 日期属性上声明它:
.Properties(pr => pr
.Date(dt => dt
.Name(n => n.dateOfBirth)
.NullValue(new DateTime(0001, 01, 01))))
因为 DateAttribute
的 NullValue
是 DateTime
,所以不能在应用于 POCO 属性 的属性上设置它,因为设置值需要是一个编译时间常数。这是使用属性方法进行映射的限制之一。
NullValue
可以通过几种方式设置:
使用流畅API
流畅映射可以完成属性映射可以做的所有事情,还可以处理空值、multi_fields 等功能
public class MyDocument
{
public DateTime DateOfBirth { get; set; }
}
var fluentMappingResponse = client.Map<MyDocument>(m => m
.Index("index-name")
.AutoMap()
.Properties(p => p
.Date(d => d
.Name(n => n.DateOfBirth)
.NullValue(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))
)
)
);
使用访客模式
定义一个将访问POCO中所有属性的访问者,并使用它来设置一个空值。访问者模式对于将约定应用于您的映射很有用,例如,所有字符串属性都应该是一个 multi_field 和一个未分析的原始子字段。
public class MyPropertyVisitor : NoopPropertyVisitor
{
public override void Visit(IDateProperty type, PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute)
{
if (propertyInfo.DeclaringType == typeof(MyDocument) &&
propertyInfo.Name == nameof(MyDocument.DateOfBirth))
{
type.NullValue = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
}
}
}
var visitorMappingResponse = client.Map<MyDocument>(m => m
.Index("index-name")
.AutoMap(new MyPropertyVisitor())
);
fluent mapping和visitor都会产生如下请求
{
"properties": {
"dateOfBirth": {
"null_value": "1970-01-01T00:00:00Z",
"type": "date"
}
}
}
Take a look at the automapping documentation for more information.