Elasticsearch 中的索引模板:如何使用可组合模板

探索可组合模板以及如何创建模板。

Elasticsearch 允许您快速且灵活地对数据构建索引。在云端免费试用或在本地运行,看看构建索引有多简单。

Elasticsearch 索引可通过映射、设置和别名进行配置:

  • 映射定义指定了数据模式。
  • 设置将设定分区大小和刷新率。
  • 别名用于为索引提供备用名称。

当我们首次为文档创建索引或使用创建索引 API 创建空索引时,将使用默认设置创建索引,不包含数据模式和别名。这些默认设置在开发和测试环境中非常有效,但我们可能需要为生产环境定制索引。

在生产中使用默认映射和设置可能会导致索引和搜索性能低下。 手动实例化索引是一个繁琐耗时的过程。如果我们有一个复杂的映射模式以及自定义设置和别名,在每个环境中重新创建这样的索引尤其不切实际。

幸运的是,Elasticsearch 提供了一种工具,可以在创建索引时以索引 模板的形式自动应用预定义配置。

索引模板

通过索引模板,我们可以创建用户自定义配置的索引。索引在实例化过程中可以从这些模板中提取配置,例如设定分片和副本的数量或字段映射。模板中将定义一个名称模式和一些配置。如果索引名称与模板的命名模式相匹配,新索引将按照模板中定义的配置创建。

Elasticsearch 在 7.8 版本中升级了模板功能,增加了可组合模板。如本文所示,新版本提供了更多可重复使用的索引模板。

模板类型

索引模板可分为两类:

  • 索引模板(或可组合索引模板):可组合索引模板既可以单独存在,也可以由一个或多个组件模板组成(见第二类)。
  • 组件模板:组件模板本身就是一个可重复使用的模板,它定义了所需的配置。通常,组件模板应与索引模板相关联。每个组件模板都可以附加一个或多个索引模板。

如下图所示,索引模板 A 和 B 之间共享组件模板(本例中只有一个--模板 3)。索引模板可由一个或多个组件模板组成,每个组件模板可与一个或多个索引模板相关联。这两种模板都可以单独存在,但组件模板除非附加到索引模板上,否则没有任何用处。

总体思路是开发一个组件模板目录,供企业用于满足各种需求(例如,为个别环境指定各种组件模板),并通过可组合索引模板将其附加到各种索引。

如何创建可组合(索引)模板

Elasticsearch 提供了一个 _index_template 端点,用于管理索引模板。用户在此模板中提供所有必需的映射、设置和别名以及索引名称模式。让我们以创建微服务应用程序customer-order-service的模板为例,该应用程序负责订单生成逻辑。

比方说,我们的需求是为客户订单创建一个模板,该模板使用带有通配符的模式表示:*orders.该模板应具有某些映射和设置,如订单日期字段以及分片和副本编号。

任何在创建过程中与此模板匹配的索引都会继承此模板中定义的配置。例如,black_friday_orders 索引将包含 order_date 字段,分片将设置为 5,副本设置为 2。 除此之外,从该模板创建的所有索引也将继承一个别名!让我们创建一个订单模板(orders_template),其索引模式定义为 *orders,映射模式由一个日期格式为 dd-MM-yyyy 的 oder_date 字段组成。下面的代码显示了如何创建该索引模板。

在 Kibana 的 DevTools 中执行此查询时,会创建包含索引模式 *orders 以及预定义映射、设置和别名的模板。index_patterns 是一个匹配模式数组;任何与该模式匹配的索引都将导出模板配置。您可以执行以下操作来获取持久化模板,该模板应重申我们的操作:

在创建模板属性时还会定义一个优先级(正数):每个模板都有一个优先级,这样不同模板的任何冲突更改都会通过使用该值来解决,优先级较高的值优先。下面我们将更深入地探讨模板的优先级。

使用模板创建索引

现在我们有了一个模板--创建索引的蓝图--下一步就是创建索引。当索引名称与给定模式匹配时,将自动应用模板化配置。为了证明这一点,正如下面的代码所示,让我们创建一个名为:blackfriday_orders 的全新索引:

由于索引名称(blackfriday_orders)与模板中定义的命名模式(即*orders),该索引应获取从模板派生的所有配置。让我们通过执行以下代码来检索这个新创建的索引,并检查其是否属实:

应该返回

如回复所示,blackfriday_orders 的配置已从模板继承。我们可以尝试各种指数组合,以成功继承模板配置:

但是,下列索引将不会继承配置,因为名称与模式不匹配:

需要记住的重要一点是,在本例中,从模板派生的所有索引都有相同的别名--all_orders。使用这种别名有一个好处--我们可以简单地查询这个单一的别名,而不是多个索引。

当我们为 *orders 创建模板时,任何匹配的索引都会采用模板配置。通常,出于各种原因,团队会有意无意地多创建几个模板。这意味着有时索引名称可能会匹配两个不同的模板模式!Elasticsearch 必须决定需要应用这些模板中的哪些配置。幸运的是,使用模板优先权可以解决这一难题。

创建组件模板

我们在本文前半部分了解了索引模板。使用内置配置创建模板有几个缺点,其中一个缺点是不能将配置导出到其他模板中。如果我们希望有类似的配置,比如与客户相关的模板(*客户),我们可能需要重新创建整个模板。这意味着,在一个典型的组织中,我们可能会创建几十个这样的系统(此外,根据环境的不同,您可能还会创建更多的系统)。

我们一直期待着可重用性,因此 Elasticsearch 在重新设计模板时考虑到了可重用性。组件模板正好符合这一要求。如果你是 DevOps 背景,很可能需要为每个环境创建预设配置的索引。与其繁琐地手动应用这些配置,不如为每个环境创建一个组件模板。

组件模板只不过是一个可重复使用的配置块,我们可以用它来组成更多的索引模板。请注意,组件模板除非与索引模板结合在一起,否则没有任何价值。它们通过 _component_template 端点公开。让我们看看这一切是如何组合在一起的。

设置模板

让我们提取之前在索引模板中定义的设置,并从中创建一个组件模板。settings_component_template 预计有五个主分区,每个主分区有两个副本。正如下面的代码列表所示,第一步是用此配置声明并执行一个组件模板。

如上面的代码所示,我们使用 _component_template 端点创建组件模板。请求正文在模板对象中保存模板信息。settings_component_template 现在可在索引模板的其他地方使用。一个显著的区别是,这个模板没有定义任何索引模式;它只是一个为我们配置一些属性的代码块。

映射模板

同样,让我们创建另一个模板。这次,让我们提取之前在独立索引模板中定义的映射模式。下面的代码显示了脚本:

别名模板

按照同样的流程,我们还可以在组件模板中加入别名--两个别名(all_orders 和 sales_orders):

可组合索引模板

现在我们有了这三个组件模板,下一步就是将它们投入使用。我们可以让索引模板使用它,比如 christmas_orders:

composed_of 标签是组成该模板的所有组件模板的集合。在这种情况下,我们要选择设置、映射和别名组件模板。我们还将提高优先级,使该模板优先于其他模板。模板就绪后,任何与 *orders 模式匹配的索引都将继承这三个组件模板的配置。

尽管如此,如果我们希望创建一个新模板,例如客户模板,只使用一个现有模板(settings_component_template)和一个新创建的别名模板(aliases_component_template,见下文),我们可以通过以下方法实现:

索引模板是这样的

您是否发现 settings_component_template 被(重新)用于两个不同的模板?这就是组件模板的力量。

模板优先级

开发人员有可能在没有查看现有库存的情况下创建多个索引模板。重要的是要为每个模板设置优先级,以便使用优先级较高的模板。例如,在下面的代码片段中,my_orders_template_1 会覆盖 my_orders_template_2:

如果有多个模板与正在创建的索引相匹配,Elasticsearch 会应用所有匹配模板中的所有配置,但会覆盖优先级较高的配置。

模板优先

最后,您可能想知道模板的优先级--组件模板中定义的配置是否优先于主索引模板本身定义的配置?还是相反?嗯,是有一些规则的:

  • 使用显式配置创建的索引优先于所有配置--这意味着如果使用显式配置创建索引,不要指望它们会被模板覆盖。
  • 传统模板(7.8 版之前创建的模板)的优先级低于可组合模板。

总结

  • 索引包含映射、设置和别名:映射定义字段模式,设置设置索引参数(如分片数和副本数),别名为索引提供备用名称。
  • 通过模板,我们可以创建具有预定义配置的索引。使用与特定模板中定义的索引模式相匹配的名称命名索引,将自动根据模板配置该索引。
  • Elasticsearch 在 7.8 版中引入了可组合索引模板。可组合的索引模板可实现模板的模块化和版本化。
  • 可组合模板由一个或多个组件模板组成。
  • 索引模板也可以定义自己的配置。
  • 组件模板是一种可重复使用的模板,具有预定义的配置,就像可组合索引模板一样。
  • 但是,组件模板应该是索引模板的一部分;如果没有 "组成 "索引模板,组件模板就毫无用处。
  • 组件模板中没有定义索引模式,这也是它们 "有望 "成为索引模板一部分的另一个原因。
  • 每个模板都有一个优先级--一个正数。数字越大,应用该模板的优先级就越高。

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用