扩展NEST的类型

869 发布于: 2021-04-02 读完约需 2 分钟

概述

有时你可能想提供一个类型的自定义实现,可能是为了解决某个问题或者因为正在使用基于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官方表示将在以后支持这一功能。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册