首页 > 编程笔记 > 通用技能 阅读:2

Elasticsearch(es)创建索引(自动创建和手动创建)

当我们首次索引文档时,Elasticsearch 会隐式地创建索引,这是创建索引的方法之一。另一种方法是显式地创建索引,通过这种方法创建索引,可以更好地控制自定义索引。

隐式创建索引(自动创建)

当我们首次索引文档时,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 属性是动态的,因此无论索引是否处于活动状态,该属性都会立即生效。

如果想使用新的设置来重新配置索引,必须执行以下几个步骤:

相关文章