【问题标题】:ElasticSearch - Auto mappingElasticSearch - 自动映射
【发布时间】:2017-06-17 07:28:25
【问题描述】:

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

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

【问题讨论】:

    标签: .net elasticsearch nest


    【解决方案1】:

    基本上有four ways to map C# POCO properties to fields of a document within Elasticsearch:

    1. Using Automap to infer POCO 属性类型中的 Elasticsearch 字段类型
    2. Using Attributes 明确控制属性类型如何映射到字段类型
    3. Using fluent mapping 控制属性类型如何映射到字段类型
    4. Applying mapping conventions through implementing a visitor

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

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

    【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2019-09-27
    • 2019-05-18
    相关资源
    最近更新 更多