我很难找到NEST 2.0的详细信息,这是我正在使用的Elasticsearch 2.2的包装器。我的问题是:我可以在一个对象(具有公共数据成员的类)上进行批量插入,并将其映射到Elasticsearch,其中只有我的C#类和ES服务器映射之间的映射字段将保存?并且它不会在我的班级中添加我不想要的其他字段?
现在我有一个包含字符串和双精度的类以及其他类的列表。我想保存字符串和双精度数,但不包括我在Elasticsearch上的批量插入列表。它希望在我班级的每个领域保存每一段数据。是否有类成员属性或其他方式说“如果没有映射,请不要添加此字段”我错过了?希望如此。
答案 0 :(得分:7)
您可以使用NEST 2.x以多种方式忽略POCO的属性。我们以下面的POCO为例
using Nest;
using Newtonsoft.Json;
[ElasticsearchType(Name = "company")]
public class Company
{
public string Name { get; set; }
[String(Ignore = true)]
public string IgnoreViaAttribute { get; set; }
public string IgnoreViaSettings { get;set; }
[JsonIgnore]
public string IgnoreViaSerializerSpecificAttribute { get; set; }
}
1.在派生的Ignore
类型(在我们的示例中,ElasticsearchPropertyAttribute
属性StringAttribute
)上使用IgnoreViaAttribute
属性应用于应该忽略的属性POCO
2.使用连接设置上的.InferMappingFor<TDocument>(Func<ClrTypeMappingDescriptor<TDocument>, IClrTypeMapping<TDocument>> selector)
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.InferMappingFor<Company>(i => i
.Ignore(p => p.IgnoreViaSettings)
);
var client = new ElasticClient(settings);
这些设置是根据ConnectionSettings
的实例缓存的。
3.使用应用于POCO属性的ignore属性,该属性由IElasticsearchSerializer
使用,并在序列化程序的CreatePropertyMapping()
内部进行检查。对于默认的JsonNetSerializer
,这是Json.NET JsonIgnoreAttribute
。在我们的示例中,应用于IgnoreViaSerializerSpecificAttribute
属性的属性证明了这一点。
答案 1 :(得分:1)
我通过挖掘一下并测试一个小类来发现,当您使用NEST 2.0 C#发布类时,以下结构确实隐藏了属性。如果您在进行覆盖它的批量添加时希望忽略的类成员上方执行此操作。
UINT8 u8NAL[4] = {0x00, 0x00, 0x00, 0x01};
char name1[100], name2[100];
_snprintf(name1, 99, "D:\\sizeH264_%p.txt", threadArgs->clientHandle);
_snprintf(name2, 99, "D:\\dataH264_%p.h264", threadArgs->clientHandle);
fp = fopen(name1, "w");
fpFrames = fopen(name2, "wb");
fwrite(u8NAL, 4, 1, fpFrames);
fwrite(threadArgs->tmpStreamParams->spsData, threadArgs->tmpStreamParams->spsDataSize, 1, fpFrames);