在 NEST (elasticsearch) 中使用二进制类型

Ode*_*yar 0 binary elasticsearch nest elasticsearch-net

我想通过我的 C# 代码将一个二进制参数存储在我的 Elasticsearch 服务器中。我尝试在索引类中使用的类型都没有转换为它。

有没有办法明确指示我的程序存储二进制文件,比如从字节数组(当然可以转换为其他类型)?

或者,有没有办法配置不存储的参数(如 Json 属性"stored": false)?对我来说主要问题是复制和索引那个大参数(不理想但足够)

更新:我试图将我的 NEST 版本降级到 1.6.1 以使用该属性

[ElasticProperty(Name = "Data", Type = FieldType.Binary, Store = false)]
public byte[] Data { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是当我使用该属性保存文档时,它仍然坚持映射一个字符串(我通过GET mydb/_mapping在我的 Sense 插件中运行来检查)

Rus*_*Cam 5

Elasticsearch 支持二进制类型,可以使用 NEST 中的属性在 NEST 1.x 中使用以下属性进行设置

public class Document
{
    [ElasticProperty(Type = FieldType.Binary, Store = false)]
    public string Binary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者

public class Document
{
    [Binary(Store= false)]
    public string Binary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在 NEST 2.x 中

请注意,二进制类型应作为 base 64 编码字符串(1.x docs2.x docs)发送到 Elasticsearch 。您可以使用类似 (for 2.x) 的方式处理 POCO 类型中的转换

public class Document
{
    [JsonIgnore]
    public byte[] BinaryBytes { get; set;}

    [Binary]
    [JsonProperty("binary")]
    public string Binary
    {
        get
        {
            return BinaryBytes != null ? Convert.ToBase64String(BinaryBytes) : null;
        }
        protected set
        {
            if (value != null) BinaryBytes = Convert.FromBase64String(value);
        }
    }
}  

client.CreateIndex("index-name", c => c
    .Mappings(m => m
        .Map<Document>(d => d
            .AutoMap()
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

这产生

{
  "mappings": {
    "document": {
      "properties": {
        "binary": {
          "type": "binary"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后您将BinaryBytes在模型上进行设置,NEST 将发送Binary请求中的内容。Binary如果模型的用户不会感到困惑,您也可以创建一个私有属性。