Elasticsearch中的mapping和template有什么区别?

8

在ES中,我们有两个概念:映射和模板。我读了官方关于这两个概念的解释,但仍然感到困惑。

  1. 在模板中,我们可以定义映射。那么,在这种情况下,为什么我们需要映射呢?
  2. 如果我想要更新映射,我能否只是在模板中修改它?
2个回答

22

模板映射是两个不同的东西。更让人困惑的是,短语“模板”用于两个不同但相关的功能。

映射

索引的映射是将所有存储在该索引中的数据定义为模式。可以将其视为实际存在的内容。

索引模板

索引模板用于更轻松地为新索引定义映射。如果要定义许多共享某些公共映射或设置的索引,则可以使用这些共享设置定义索引模板,并自动应用它们。在模板中,您告诉ElasticSearch它可以将这些模板应用于哪些索引。

索引模板参考

映射中的dynamic_templates

为了完整起见,模板还出现在ElasticSearch中的另一个位置。当您为新索引声明映射时,还可以定义dynamic_templates部分。这允许您根据新字段的类型或名称定义ElasticSearch定义字段映射。例如,您可以创建一个条目,指定任何名称以“_date”结尾的字段都应视为日期字段。这些让您按约定定义字段,而不需要为每个字段显式指定其字段映射。

动态模板参考

值得注意的是,对于{{Index Templates}}和{{dynamic_templates}}部分,这些值仅在创建索引/字段时应用。在您的映射定义中,如果您明确指定与模板不同的内容,则它将使用您的值。因此,回到您的问题:
1.在模板中,我们可以定义映射。在这种情况下,为什么我们需要映射?
{{Index Templates}}适用于将映射应用于多个创建的索引。如果您不创建多个相同的索引,则可能只需手动定义映射。{{dynamic_templates}}在索引定义中很有用,可通过命名约定定义字段类型。对此所做的任何更改都仅影响添加到索引中的新字段。
2.如果我想更新映射,我可以在模板中修改它吗?
不,一旦创建索引,{{Index Templates}}的更新将不会影响该索引。它们仅应用于新索引。{{dynamic_templates}}的更新也仅影响索引中的新字段。

感谢您提供的所有细节!这确实很有道理。非常感谢!! - Gabriel

2

映射是当前索引所拥有的内容。这些可以在索引上设置和更新。

模板用于在创建新索引时为其创建映射。从我所知道的,它们都来自相同的JSON负载,只是不同的ES端点。

因此,如果应用了映射但没有应用模板,明天的索引很可能会有昨天的映射。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接