我想从我的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
进行检查)
答案 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 docs或2.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
设为私有财产。