概述
有时你可能想提供一个类型的自定义实现,可能是为了解决某个问题或者因为正在使用基于Elasticsearch特性扩展的第三方插件,而NEST
并没有提供开箱即用的支持。
NEST
允许你在某些场景下扩展自己的类型。
创建自定义属性映射
举个例子,假设我们正在使用一个第三方插件,它为字段映射提供了附加数据类型的支持。我们可以实现一个自定义的IProperty
实现,这样我们就可以使用带有NEST
的字段映射类型。
public class MyPluginProperty : IProperty
{
IDictionary<string, object> IProperty.LocalMetadata { get; set; }
IDictionary<string, string> IProperty.Meta { get; set; }
public string Type { get; set; } = "my_plugin_property";
public PropertyName Name { get; set; }
public MyPluginProperty(string name, string language)
{
this.Name = name;
this.Language = language;
this.Numeric = true;
}
[PropertyName("language")]
public string Language { get; set; }
[PropertyName("numeric")]
public bool Numeric { get; set; }
}
PropertyNameAttribute
可以用来标记应该被序列化的属性。如果没有这个属性,NEST
将不会序列化这个属性。
现在我们有了自己的IProperty
实现,可以在创建索引时将其添加到属性映射中:
var createIndexResponse = client.Indices.Create("myindex", c => c
.Map<Project>(m => m
.Properties(props => props
.Custom(new MyPluginProperty("fieldName", "dutch"))
)
)
);
序列化的JSON请求如下:
{
"mappings": {
"properties": {
"fieldName": {
"type": "my_plugin_property",
"language": "dutch",
"numeric": true
}
}
}
}
虽然NEST
可以序列化my_plugin_property
,但目前还不能反序列化,Elastic官方表示将在以后支持这一功能。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册