2016-07-07 60 views
0

我想从我的C#代码中获取存储在我的Elasticsearch服务器中的二进制参数。 我试图在我的索引类中使用的类型都转换为它。与NEST(elasticsearch)一起使用二进制类型

有没有一种方法来明确地指示我的程序存储二进制文件,比如说从一个字节数组(可以转换为其他类型的课程)?

另外,有没有一种方法来配置参数不被存储(像使用Json属性"stored": false)?至于我的主要问题是,大参数的复制和索引(不理想,但足够了)

更新:我想降级我NEST版本1.6.1使用属性

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

但当我将文档保存与该属性,它仍然坚持映射一个字符串(我检查由我的感觉插件运行GET mydb/_mapping

回答

4

Elasticsearch supports binary types可以使用使用NEST中的属性被设置在NEST的1.x以下

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的

注意,二进制类型应该被发送到Elasticsearch作为基64编码的串(1.x docs2.x docs)。你可以处理这种转换在你的POCO类型的东西,如(对于2.X)

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作为私人财产。

+0

感谢您的帮助,似乎只是增加'client.CreateIndex'部分而不是让NEST自己做它我自己给了我想要的东西 –

+0

@OdedSayar有两件事Elasticsearch帮助起床并跑步;首先,如果它不存在,自动创建一个索引。这种行为可以通过 - https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-creation进行控制。其次,如果未为文档类型指定明确的映射,则动态地映射(即推断文档的字段的类型)。这也可以控制 - https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html –