所以最近我开始研究ES,我想到将当前的ElasticSearch.Net和Nest版本从1.x升级到5.x.我注意到了一些变化。
我的问题是关于最新版本中的自动映射功能。之前我有每个属性的属性。 比如说:
[ElasticProperty(Name = "age", Type = FieldType.Integer)]
public int Age { get; set; }
但在较新的版本中,我可以做类似
的事情[Number(NumberType.Integer, Name = "age")]
public int Age { get; set; }
我想知道该属性是否真的需要,因为我在文档中读到v5.x中我们有自动映射功能。这会自动将ES中的所有字段映射到.Net中的属性吗?
我们什么时候才真正需要映射?是仅在创建新类型时还是在从ES或两者中获取数据时都需要它?
我希望我的问题有道理。
答案 0 :(得分:2)
基本上有four ways to map C# POCO properties to fields of a document within Elasticsearch:
这四种方式可以结合起来,为您的地图提供灵活性;使用Properties()
的流畅映射优先于所有其他映射。
您何时会使用属性而非推断映射?
当您想要稍微不同地映射可能推断的映射时。举个例子
[Number(NumberType.Integer, Name = "age")]
public int Age { get; set; }
这里,属性映射正在应用与推断的完全相同的映射,因此在这种情况下,它将是多余的。相反,想象一下我们不希望值被强制转换为数字,想要忽略格式错误的值并且不希望在_all
字段中包含值;我们可以通过属性映射来实现这个目标
[Number(NumberType.Integer, Name = "age", Coerce = false, IgnoreMalformed = true, IncludeInAll = false)]
public int Age { get; set; }
什么时候会对属性使用流畅的映射?
如果您不想使用属性进行映射,或者希望以无法用属性映射表示的方式映射POCO,例如 multi_fields
我们什么时候才真正需要映射?是仅在创建新类型时还是在从ES或两者中获取数据时都需要它?
在将第一个文档索引到索引之前,需要将映射添加到索引。如果在索引第一个文档之前没有添加映射,默认情况下Elasticsearch将使用自己的推理从它看到的第一个文档中推断出架构。
您可以在索引创建时添加映射,也可以在创建索引之后但在索引第一个文档之前添加映射。前者通常是最常见的。