ElasticSearch - 自动映射

时间:2017-06-17 07:28:26

标签: .net elasticsearch nest

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

我希望我的问题有道理。

1 个答案:

答案 0 :(得分:2)

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

  1. Using Automap to infer POCO属性类型中的弹性搜索字段类型
  2. Using Attributes ,以明确控制属性类型如何映射到字段类型
  3. Using fluent mapping 控制属性类型如何映射到字段类型
  4. Applying mapping conventions through implementing a visitor
  5. 这四种方式可以结合起来,为您的地图提供灵活性;使用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将使用自己的推理从它看到的第一个文档中推断出架构。

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