ElasticSearch - 自动映射

标记

所以最近我开始研究 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 或两者获取数据时才需要?

我希望我的问题是有道理的。

罗斯凸轮

基本上有四种方法可以将 C# POCO 属性映射到 Elasticsearch 中的文档字段

  1. 使用 Automap从 POCO 属性类型推断Elasticsearch 字段类型
  2. 使用属性显式控制属性类型如何映射到字段类型
  3. 使用连贯映射来控制属性类型如何映射到字段类型
  4. 通过实现访问者应用映射约定

这四种方式可以结合起来,为您的映射方式提供灵活性;使用流畅的映射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 将使用它自己的推理从它看到的第一个文档推断架构。

您可以在创建索引时添加映射,或者在创建索引之后但在索引第一个文档之前添加映射。前者通常是最常见的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章