使用带有NEST的二进制类型(elasticsearch)

时间:2016-07-07 05:17:00

标签: elasticsearch binary 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; }

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

1 个答案:

答案 0 :(得分:4)

Elasticsearch supports binary types可以使用NEST 1.x

中的以下内容在NEST中使用属性进行设置
public class Document
{
    [ElasticProperty(Type = FieldType.Binary, Store = false)]
    public string Binary { get; set; }
}

public class Document
{
    [Binary(Store= false)]
    public string Binary { get; set; }
}

在NEST 2.x

请注意,二进制类型应作为基本64位编码字符串(1.x docs2.x docs)发送给Elasticsearch。您可以使用类似(对于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()
        )
    )
);

产生

{
  "mappings": {
    "document": {
      "properties": {
        "binary": {
          "type": "binary"
        }
      }
    }
  }
}

然后你要在模型上设置BinaryBytes,NEST会在请求中发送Binary的内容。如果模型用户不那么容易混淆,您也可以将Binary设为私有财产。