Elasticsearch(es)创建索引(自动创建和手动创建)
当我们首次索引文档时,Elasticsearch 会隐式地创建索引,这是创建索引的方法之一。另一种方法是显式地创建索引,通过这种方法创建索引,可以更好地控制自定义索引。
当以这种方式创建索引时,Elasticsearch 使用默认设置,例如,将主分片和副本分片的数量设置为 1。为了演示,我们使用文档 API 快速索引一个包含 car 信息的文档,示例代码如下:
索引使用默认的设置进行配置,文档 ID 为 1。我们可以通过调用 GET cars 命令来获取新创建的索引的详细信息,如下图所示:

图 1 获取 cars 索引的详细信息
在这个响应中,我们需要注意几个关键点,每个索引都包含映射(mappings)、设置(settings)和别名(aliases)3 个部分。Elasticsearch 根据每个字段的值自动推断其数据类型,并创建映射模式。
例如,由于 make 和 model 字段似乎包含文本信息,因此这些字段被创建为 text 类型的字段。此外,Elasticsearch 默认为索引分配了一个主分片和一个副本分片。
下面的示例代码中禁用了这个功能:
虽然禁用这个功能听起来很酷,但实际上不建议这样做。这样做会限制所有索引的自动创建,但 Elasticsearch 或 Kibana 可能需要出于管理目的创建索引,例如 Kibana 经常会创建隐藏索引(在索引名前面加上一个点会被视为隐藏索引,如 .user_profiles 和 .admin 等)。
除了采用“一刀切”的方式完全禁用自动索引创建,其实还有更灵活的方法来调整这个属性。我们可以通过提供一组用逗号分隔的正则表达式来选择性地允许(或禁止)某些索引的自动创建。
下面是一个示例:
例如,如果我们试图将一个文档索引到 flights 索引中,索引将创建失败,因为索引名不匹配我们刚刚定义的正则表达式。下面是 Elasticsearch 抛出的异常:
此外,Elasticsearch 可能无法根据文档的字段值推断出正确的数据类型。错误的数据类型会在搜索操作中导致问题。
映射是创建模式定义的过程。存储的数据通常包含多种与其字段相关联的数据类型,如 text、keyword、long、date 等。
Elasticsearch 参考映射定义,在存储数据之前应用适当的规则来分析传入的数据,以便实现高效和有效的搜索。例如,以下代码段为 cars_index_ with_sample_mapping 索引设置了映射:
每个索引都带有一组配置设置,如分片数和副本数、刷新频率、压缩编解码器等。动态设置(dynamic settings)可以在运行时对活动索引进行调整,静态设置(static settings)则应用于非运行模式下的索引。
下面的示例代码中配置了索引的一些设置:
别名是为索引指定的替代名称。一个别名可以指向单个或多个索引。例如,my_cars_aliases 别名可以指向所有汽车索引。我们还可以像在单个索引上执行查询一样在别名上执行查询。
下面的示例代码展示了如何创建一个别名:
当显式创建索引时,我们可以预先设置映射、设置和别名。这样,索引在创建时就已经具备了所有必需的配置。当然,我们也可以在运行时修改其中的一些配置(也可以调整关闭的索引,即调整那些非运行索引)。
创建索引很简单,只需发出 PUT <index_name> 命令。该命令会用默认配置创建一个新索引(类似于首次为文档建立索引时自动创建的索引)。例如,PUT cars 创建一个 cars 索引,执行 GET cars 命令会返回该索引。
让我们看看如何用自定义配置来管理这些索引。
然而,正如我们提到的,并非所有属性都可以在活动索引上更改——只有动态属性可以更改。这就引出了对索引设置的两种类型(静态和动态)的简要讨论。
静态设置是在创建索引时应用的设置,在索引运行期间无法更改。这些属性包括分片数、压缩编解码器、启动时的数据检查等。如果想更改活动索引的静态设置,必须先关闭索引以重新应用设置,或者使用新设置重新创建索引。
动态设置可以应用于活动(运行中)索引。例如,我们可以在活动索引上更改副本数、允许或禁止写入、刷新间隔等属性。
有少数设置同时属于这两个阵营,因此从长远来看,对每种类型都有一个高层次的理解会很有帮助。让我们看看如何使用一些静态设置来创建索引。
例如,我们想创建一个索引并应用以下属性:3 个主分片,每个主分片有 5 个副本,压缩编解码器,脚本字段的最大数量,以及刷新间隔。为了将这些设置应用于索引,我们使用一个 settings 对象,代码如下:
如前所述,一旦索引处于活动状态,某些设置就无法更改(静态设置),而其他设置(动态设置)可以在活动索引上更改。如果尝试在活动索引上更改任何静态属性(例如,number_ of_shards 属性),Elasticsearch 就会抛出一个异常,提示无法更新非动态设置。
我们可以使用 _settings 端点来更新动态设置,示例代码如下:
如果想使用新的设置来重新配置索引,必须执行以下几个步骤:
隐式创建索引(自动创建)
当我们首次索引文档时,Elasticsearch 不会抱怨索引不存在,相反,它会愉快地为我们创建一个索引。当以这种方式创建索引时,Elasticsearch 使用默认设置,例如,将主分片和副本分片的数量设置为 1。为了演示,我们使用文档 API 快速索引一个包含 car 信息的文档,示例代码如下:
DELETE cars ←--- 删除cars索引,以便我们从头开始 PUT cars/_doc/1 ←--- 索引此前不存在,但在首次索引文档时被创建。 通过索引一个文档,我们隐式地创建了cars索引 { "make":"Maserati", "model":"GranTurismo Sport", "speed_mph":186 }由于这是将要存储在 cars 索引中的第一个文档,因此当我们向 Elasticsearch 发送这个请求时,服务器会立即创建一个名为 cars 的索引,因为该索引在存储中不存在。
索引使用默认的设置进行配置,文档 ID 为 1。我们可以通过调用 GET cars 命令来获取新创建的索引的详细信息,如下图所示:

图 1 获取 cars 索引的详细信息
在这个响应中,我们需要注意几个关键点,每个索引都包含映射(mappings)、设置(settings)和别名(aliases)3 个部分。Elasticsearch 根据每个字段的值自动推断其数据类型,并创建映射模式。
例如,由于 make 和 model 字段似乎包含文本信息,因此这些字段被创建为 text 类型的字段。此外,Elasticsearch 默认为索引分配了一个主分片和一个副本分片。
1) 禁用索引的自动创建功能
Elasticsearch 允许通过将 action.auto_create_index 属性设置为 false(默认为true)来阻止自动创建索引。我们可以使用集群设置 API 来修改这个集群范围的属性,从而调整该标志的值。下面的示例代码中禁用了这个功能:
PUT _cluster/settings ←--- 更新整个集群的设置 { "persistent": { ←--- 这些更改可以是永久或临时的 "action.auto_create_index":false ←--- 关闭自动创建 } }persistent 属性表示设置将是永久的。相比之下,使用 transient 属性设置的更改只会持续到 Elasticsearch 服务器下次重启。
虽然禁用这个功能听起来很酷,但实际上不建议这样做。这样做会限制所有索引的自动创建,但 Elasticsearch 或 Kibana 可能需要出于管理目的创建索引,例如 Kibana 经常会创建隐藏索引(在索引名前面加上一个点会被视为隐藏索引,如 .user_profiles 和 .admin 等)。
除了采用“一刀切”的方式完全禁用自动索引创建,其实还有更灵活的方法来调整这个属性。我们可以通过提供一组用逗号分隔的正则表达式来选择性地允许(或禁止)某些索引的自动创建。
下面是一个示例:
action.auto_create_index: [".admin*, cars*, "*books*", "-x*","-y*","+z*"]这个设置允许自动创建以 admin 为前缀的隐藏索引,以及任何以 cars 或 books 为前缀的索引和那些跟在加号(+)后面的索引。然而,这个设置不允许自动创建任何以 x 或 y 开头的索引,因为减号(-)表示不允许自动创建索引。这也意味着任何不匹配该模式的其他索引都不会自动创建。
例如,如果我们试图将一个文档索引到 flights 索引中,索引将创建失败,因为索引名不匹配我们刚刚定义的正则表达式。下面是 Elasticsearch 抛出的异常:
no such index [flights] and [action.auto_create_index] ([.admin*, cars*, *books*, -x*,-y*,+z*]) doesn't match允许服务器创建索引有助于加速开发过程。但是,我们很少在不调整这些属性的情况下就进入生产环境。例如,我们可能决定采用每个索引有 10 个主分片和每个分片 2 个副本的策略,因此我们必须更改设置(设计一个只有一个主分片的搜索服务将是灾难性的)。
此外,Elasticsearch 可能无法根据文档的字段值推断出正确的数据类型。错误的数据类型会在搜索操作中导致问题。
显式创建索引(手动创建)
Elasticsearch 允许我们根据需要配置和显式创建索引,以满足我们的需求。在开发自定义索引之前,我们需要先了解索引配置。1) 索引配置
无论索引是自动创建的还是显式创建的,都由包含映射、设置和别名的配置组成。映射是创建模式定义的过程。存储的数据通常包含多种与其字段相关联的数据类型,如 text、keyword、long、date 等。
Elasticsearch 参考映射定义,在存储数据之前应用适当的规则来分析传入的数据,以便实现高效和有效的搜索。例如,以下代码段为 cars_index_ with_sample_mapping 索引设置了映射:
PUT cars_index_with_sample_mapping { "mappings": { "properties": { "make":{ "type": "text" } } } }我们可以发出 GET cars_index_with_sample_mapping/_mapping 命令来获取刚刚创建的 cars_index_with_sample_mapping 索引的模式。
每个索引都带有一组配置设置,如分片数和副本数、刷新频率、压缩编解码器等。动态设置(dynamic settings)可以在运行时对活动索引进行调整,静态设置(static settings)则应用于非运行模式下的索引。
下面的示例代码中配置了索引的一些设置:
PUT cars_index_with_sample_settings ←--- 创建索引 { "settings": { ←--- 应用设置 "number_of_replicas": 3, "codec": "best_compression" } }调用 ET cars_index_with_sample_settings/_settings 获取这个索引的设置。
别名是为索引指定的替代名称。一个别名可以指向单个或多个索引。例如,my_cars_aliases 别名可以指向所有汽车索引。我们还可以像在单个索引上执行查询一样在别名上执行查询。
下面的示例代码展示了如何创建一个别名:
PUT cars_index_with_sample_alias ←--- 创建索引 { "aliases": { ←--- 声明aliases对象以配置别名 "alias_for_cars_index_with_sample_alias": {} ←--- 别名本身 } }我们可以发出 GET cars_index_with_sample_alias/_alias 命令获取这个索引的别名。
当显式创建索引时,我们可以预先设置映射、设置和别名。这样,索引在创建时就已经具备了所有必需的配置。当然,我们也可以在运行时修改其中的一些配置(也可以调整关闭的索引,即调整那些非运行索引)。
2) 显式创建索引
隐式创建的索引很少能满足生产配置的要求。显式创建索引意味着我们需要设置自定义配置。我们可以指示 Elasticsearch 使用指定的映射、设置和别名来配置索引,而不是依赖默认值。创建索引很简单,只需发出 PUT <index_name> 命令。该命令会用默认配置创建一个新索引(类似于首次为文档建立索引时自动创建的索引)。例如,PUT cars 创建一个 cars 索引,执行 GET cars 命令会返回该索引。
让我们看看如何用自定义配置来管理这些索引。
3) 自定义索引设置
每个索引在创建时都可以使用默认或自定义的设置。我们还可以在索引仍在运行时更改某些设置。为此,Elasticsearch 公开 _settings API 来更新活动索引上的设置。然而,正如我们提到的,并非所有属性都可以在活动索引上更改——只有动态属性可以更改。这就引出了对索引设置的两种类型(静态和动态)的简要讨论。
静态设置是在创建索引时应用的设置,在索引运行期间无法更改。这些属性包括分片数、压缩编解码器、启动时的数据检查等。如果想更改活动索引的静态设置,必须先关闭索引以重新应用设置,或者使用新设置重新创建索引。
动态设置可以应用于活动(运行中)索引。例如,我们可以在活动索引上更改副本数、允许或禁止写入、刷新间隔等属性。
有少数设置同时属于这两个阵营,因此从长远来看,对每种类型都有一个高层次的理解会很有帮助。让我们看看如何使用一些静态设置来创建索引。
例如,我们想创建一个索引并应用以下属性:3 个主分片,每个主分片有 5 个副本,压缩编解码器,脚本字段的最大数量,以及刷新间隔。为了将这些设置应用于索引,我们使用一个 settings 对象,代码如下:
PUT cars_with_custom_settings ←--- 使用自定义设置创建索引 { "settings":{ ←--- settings对象包含所需的属性 "number_of_shards":3, ←--- 将分片数设置为3 "number_of_replicas":5, ←--- 将副本数设置为5 "codec": "best_compression", ←--- 更改压缩方式,不使用默认值 "max_script_fields":128, ←--- 增加脚本字段的最大数量,默认是32 "refresh_interval": "60s" ←--- 更改刷新间隔,默认是1 s } }根据要求,我们指示 Elasticsearch 以我们认为必要的设置创建一个索引。执行 GET cars_ with_custom_settings 命令获取索引的详细信息,反映我们刚刚设置的分片和副本等自定义设置。
如前所述,一旦索引处于活动状态,某些设置就无法更改(静态设置),而其他设置(动态设置)可以在活动索引上更改。如果尝试在活动索引上更改任何静态属性(例如,number_ of_shards 属性),Elasticsearch 就会抛出一个异常,提示无法更新非动态设置。
我们可以使用 _settings 端点来更新动态设置,示例代码如下:
PUT cars_with_custom_settings/_settings { "settings": { "number_of_replicas": 2 } }number_of_replicas 属性是动态的,因此无论索引是否处于活动状态,该属性都会立即生效。
如果想使用新的设置来重新配置索引,必须执行以下几个步骤:
- 关闭当前索引(此时索引无法支持读/写操作);
- 使用新设置创建一个新索引;
- 将数据从旧索引迁移到新索引(重新索引操作);
- 将别名重新指向新索引(假设该索引已有别名)。