滚动更新 API

编辑

数据流索引别名创建新的索引。

resp = client.indices.rollover(
    alias="my-data-stream",
)
print(resp)
response = client.indices.rollover(
  alias: 'my-data-stream'
)
puts response
const response = await client.indices.rollover({
  alias: "my-data-stream",
});
console.log(response);
POST my-data-stream/_rollover

请求

编辑

POST /<滚动更新目标>/_rollover/

POST /<滚动更新目标>/_rollover/<目标索引>

前提条件

编辑
  • 如果启用了 Elasticsearch 安全功能,您必须具有滚动更新目标的 manage 索引权限

描述

编辑

我们建议使用 ILM 的 rollover 操作来自动化滚动更新。请参阅索引生命周期

滚动更新 API 为数据流或索引别名创建一个新索引。该 API 的行为取决于滚动更新目标。

滚动更新数据流

如果滚动更新数据流,则 API 会为该流创建一个新的写入索引。该流之前的写入索引将变为常规的后备索引。滚动更新还会增加数据流的生成。请参阅滚动更新

滚动更新具有写入索引的索引别名

在 Elasticsearch 7.9 之前,您通常会使用带有写入索引的索引别名来管理时间序列数据。数据流取代了此功能,需要更少的维护,并自动与数据层集成。

请参阅将索引别名转换为数据流

如果索引别名指向多个索引,则其中一个索引必须是写入索引。滚动更新 API 为别名创建一个新的写入索引,并将 is_write_index 设置为 true。该 API 还会将之前的写入索引的 is_write_index 设置为 false

滚动更新具有一个索引的索引别名

如果滚动更新指向只有一个索引的索引别名,则 API 会为该别名创建一个新索引,并从该别名中删除原始索引。

递增别名的索引名称

编辑

滚动更新索引别名时,您可以为新索引指定名称。如果未指定名称,并且当前索引以 - 和数字结尾,例如 my-index-000001my-index-3,则新索引名称会递增该数字。例如,如果滚动更新的别名当前索引为 my-index-000001,则滚动更新会创建一个名为 my-index-000002 的新索引。无论之前索引的名称如何,此数字始终为 6 个字符且用零填充。

等待活动分片

编辑

滚动更新会创建一个新索引,并受wait_for_active_shards 设置的约束。

路径参数

编辑
<滚动更新目标>
(必需,字符串)要滚动更新的数据流或索引别名的名称。
<目标索引>

(可选,字符串)要创建的索引的名称。支持日期数学。数据流不支持此参数。

如果别名的当前写入索引的名称不是以 - 和数字结尾,例如 my-index-000001my-index-3,则此参数是必需的。

索引名称必须满足以下条件

  • 仅限小写字母
  • 不能包含 \/*?"<>|、 ` `(空格字符)、,#
  • 7.0 之前的索引可以包含冒号 (:),但这已被弃用,并且在 7.0+ 中将不再支持
  • 不能以 -_+ 开头
  • 不能是 ...
  • 长度不能超过 255 字节(请注意,它是字节,因此多字节字符将更快地计入 255 的限制)
  • . 开头的名称已弃用,除了隐藏索引和插件管理的内部索引

查询参数

编辑
dry_run
(可选,布尔值)如果为 true,则检查当前索引是否满足指定的 conditions,但不会执行滚动更新。默认为 false
lazy
(可选,布尔值)如果为 true,则表示数据流将在下一次索引操作发生时滚动更新。仅适用于数据流。默认为 false
wait_for_active_shards

(可选,字符串)在继续操作之前,必须处于活动状态的每个分片的副本数。设置为 all 或任何非负整数,最多为索引中每个分片的副本总数(number_of_replicas+1)。默认为 1,表示仅等待每个主分片处于活动状态。

请参阅活动分片

master_timeout
(可选,时间单位)等待主节点的时间段。如果在超时到期之前主节点不可用,则请求失败并返回错误。默认为 30s。也可以设置为 -1,表示该请求永远不应超时。
timeout
(可选,时间单位)在更新集群元数据后,等待集群中所有相关节点响应的时间段。如果在超时到期之前未收到任何响应,则集群元数据更新仍然适用,但响应将指示该更新未被完全确认。默认为 30s。也可以设置为 -1,表示该请求永远不应超时。

请求正文

编辑
aliases

(可选,对象数组)目标索引的别名。数据流不支持此参数。

aliases 对象的属性
<别名>

(必需,对象)键是别名名称。索引别名名称支持日期数学

对象正文包含别名的选项。支持空对象。

<别名> 的属性
filter
(可选,查询 DSL 对象)用于限制别名可以访问的文档的查询。
index_routing
(可选,字符串)用于将索引操作路由到特定分片的值。如果指定,则这将覆盖索引操作的 routing 值。
is_hidden
(可选,布尔值)如果为 true,则别名是隐藏的。默认为 false。别名的所有索引都必须具有相同的 is_hidden 值。
is_write_index
(可选,布尔值)如果为 true,则索引是别名的写入索引。默认为 false
routing
(可选,字符串)用于将索引和搜索操作路由到特定分片的值。
search_routing
(可选,字符串)用于将搜索操作路由到特定分片的值。如果指定,则这将覆盖搜索操作的 routing 值。
conditions

(可选,对象)滚动更新的条件。如果指定,则只有当前索引满足这些条件时,Elasticsearch 才会执行滚动更新。如果未指定此参数,则 Elasticsearch 将无条件执行滚动更新。

如果指定了条件,则其中至少一个必须是 max_* 条件。如果满足任何 max_* 条件并且满足所有 min_* 条件,则索引将滚动更新。

要触发滚动更新,当前索引必须在请求时满足这些条件。Elasticsearch 不会在 API 响应后监视索引。要自动执行滚动更新,请改用 ILM 的 rollover

conditions 的属性
max_age
(可选,时间单位)在达到自索引创建以来的最大经过时间后触发滚动更新。即使将索引原始日期配置为自定义日期(例如,使用 index.lifecycle.parse_origination_dateindex.lifecycle.origination_date 设置时),经过的时间也始终自索引创建时间开始计算。
max_docs
(可选,整数)在达到指定的最大文档数后触发滚动更新。自上次刷新后添加的文档不包括在文档计数中。文档计数包括副本分片中的文档。
max_size

(可选,字节单位)当索引达到特定大小时触发滚动。这是索引中所有主分片的总大小。副本不计入最大索引大小。

要查看当前索引大小,请使用 _cat indices API。pri.store.size 值显示所有主分片的组合大小。

max_primary_shard_size

(可选,字节单位)当索引中最大的主分片达到特定大小时触发滚动。这是索引中主分片的最大大小。与 max_size 一样,副本会被忽略。

要查看当前分片大小,请使用 _cat shards API。store 值显示每个分片的大小,prirep 指示分片是主分片 (p) 还是副本 (r)。

max_primary_shard_docs

(可选,整数)当索引中最大的主分片达到特定数量的文档时触发滚动。这是索引中主分片的最大文档数。与 max_docs 一样,副本会被忽略。

要查看当前分片文档数,请使用 _cat shards API。docs 值显示每个分片的文档数。

min_age
(可选,时间单位)防止在索引创建后经过最短时间之前滚动。请参阅 max_age 的注释。
min_docs
(可选,整数)防止在达到指定的最小文档数之前滚动。请参阅 max_docs 的注释。
min_size
(可选,字节单位)防止在索引达到特定大小之前滚动。请参阅 max_size 的注释。
min_primary_shard_size
(可选,字节单位)防止在索引中最大的主分片达到特定大小之前滚动。请参阅 max_primary_shard_size 的注释。
min_primary_shard_docs
(可选,整数)防止在索引中最大的主分片达到特定数量的文档之前滚动。请参阅 max_primary_shard_docs 的注释。
mappings

(可选,映射对象)索引中字段的映射。如果指定,此映射可以包括

请参阅 映射

数据流不支持此参数。

settings

(可选,索引设置对象)索引的配置选项。请参阅 索引设置

数据流不支持此参数。

响应体

编辑
acknowledged
(布尔值)如果为 true,则请求在 timeout 期间内收到来自主节点的响应。
shards_acknowledged
(布尔值)如果为 true,则请求在 master_timeout 期间内收到来自活动分片的响应。
old_index
(字符串)数据流或索引别名的上一个索引。对于具有写入索引的数据流和索引别名,这是上一个写入索引。
new_index
(字符串)滚动创建的索引。对于具有写入索引的数据流和索引别名,这是当前的写入索引。
rolled_over
(布尔值)如果为 true,则数据流或索引别名已滚动。
dry_run
(布尔值)如果为 true,则 Elasticsearch 未执行滚动。
condition

(对象)请求的 conditions 中指定的每个条件的结果。如果未指定任何条件,则这是一个空对象。

condition 的属性
<condition>
(布尔值)键是每个条件。值是其结果。如果为 true,则索引满足条件。
lazy
(布尔值)如果为 true,则 Elasticsearch 未执行滚动,但已成功标记数据流以便在下一次索引事件时滚动。

示例

编辑

滚动数据流

编辑

以下请求无条件地滚动数据流。

resp = client.indices.rollover(
    alias="my-data-stream",
)
print(resp)
response = client.indices.rollover(
  alias: 'my-data-stream'
)
puts response
const response = await client.indices.rollover({
  alias: "my-data-stream",
});
console.log(response);
POST my-data-stream/_rollover

以下请求以延迟方式滚动数据流,这意味着数据流将在下一次索引事件时滚动。这确保了映射和设置更改将应用于即将到来的数据,但它将避免为摄取速度较慢的数据流创建额外的支持索引。

resp = client.indices.rollover(
    alias="my-data-stream",
    lazy=True,
)
print(resp)
const response = await client.indices.rollover({
  alias: "my-data-stream",
  lazy: "true",
});
console.log(response);
POST my-data-stream/_rollover?lazy

以下请求仅在当前写入索引满足以下一个或多个条件时才滚动数据流

  • 索引是 7 天或更早之前创建的。
  • 索引包含 1,000 个或更多文档。
  • 索引的最大主分片为 50GB 或更大。
resp = client.indices.rollover(
    alias="my-data-stream",
    conditions={
        "max_age": "7d",
        "max_docs": 1000,
        "max_primary_shard_size": "50gb",
        "max_primary_shard_docs": "2000"
    },
)
print(resp)
response = client.indices.rollover(
  alias: 'my-data-stream',
  body: {
    conditions: {
      max_age: '7d',
      max_docs: 1000,
      max_primary_shard_size: '50gb',
      max_primary_shard_docs: '2000'
    }
  }
)
puts response
const response = await client.indices.rollover({
  alias: "my-data-stream",
  conditions: {
    max_age: "7d",
    max_docs: 1000,
    max_primary_shard_size: "50gb",
    max_primary_shard_docs: "2000",
  },
});
console.log(response);
POST my-data-stream/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000,
    "max_primary_shard_size": "50gb",
    "max_primary_shard_docs": "2000"
  }
}

API 返回

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "old_index": ".ds-my-data-stream-2099.05.06-000001",
  "new_index": ".ds-my-data-stream-2099.05.07-000002",
  "rolled_over": true,
  "dry_run": false,
  "lazy": false,
  "conditions": {
    "[max_age: 7d]": false,
    "[max_docs: 1000]": true,
    "[max_primary_shard_size: 50gb]": false,
    "[max_primary_shard_docs: 2000]": false
  }
}

滚动具有写入索引的索引别名

编辑

以下请求创建 <my-index-{now/d}-000001> 并将其设置为 my-alias 的写入索引。

resp = client.indices.create(
    index="<my-index-{now/d}-000001>",
    aliases={
        "my-alias": {
            "is_write_index": True
        }
    },
)
print(resp)
response = client.indices.create(
  index: '<my-index-{now/d}-000001>',
  body: {
    aliases: {
      "my-alias": {
        is_write_index: true
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "<my-index-{now/d}-000001>",
  aliases: {
    "my-alias": {
      is_write_index: true,
    },
  },
});
console.log(response);
# PUT <my-index-{now/d}-000001>
PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "my-alias": {
      "is_write_index": true
    }
  }
}

以下请求仅在当前写入索引满足以下一个或多个条件时才滚动别名

  • 索引是 7 天或更早之前创建的。
  • 索引包含 1,000 个或更多文档。
  • 索引的最大主分片为 50GB 或更大。
resp = client.indices.rollover(
    alias="my-alias",
    conditions={
        "max_age": "7d",
        "max_docs": 1000,
        "max_primary_shard_size": "50gb",
        "max_primary_shard_docs": "2000"
    },
)
print(resp)
response = client.indices.rollover(
  alias: 'my-alias',
  body: {
    conditions: {
      max_age: '7d',
      max_docs: 1000,
      max_primary_shard_size: '50gb',
      max_primary_shard_docs: '2000'
    }
  }
)
puts response
const response = await client.indices.rollover({
  alias: "my-alias",
  conditions: {
    max_age: "7d",
    max_docs: 1000,
    max_primary_shard_size: "50gb",
    max_primary_shard_docs: "2000",
  },
});
console.log(response);
POST my-alias/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000,
    "max_primary_shard_size": "50gb",
    "max_primary_shard_docs": "2000"
  }
}

API 返回

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "old_index": "my-index-2099.05.06-000001",
  "new_index": "my-index-2099.05.07-000002",
  "rolled_over": true,
  "dry_run": false,
  "lazy": false,
  "conditions": {
    "[max_age: 7d]": false,
    "[max_docs: 1000]": true,
    "[max_primary_shard_size: 50gb]": false,
    "[max_primary_shard_docs: 2000]": false
  }
}

如果别名的索引名称使用日期数学,并且您以固定间隔滚动索引,则可以使用日期数学来缩小搜索范围。例如,以下搜索目标是最近三天创建的索引。

resp = client.search(
    index="<my-index-{now/d}-*>,<my-index-{now/d-1d}-*>,<my-index-{now/d-2d}-*>",
)
print(resp)
response = client.search(
  index: '<my-index-{now/d}-*>,<my-index-{now/d-1d}-*>,<my-index-{now/d-2d}-*>'
)
puts response
const response = await client.search({
  index: "<my-index-{now/d}-*>,<my-index-{now/d-1d}-*>,<my-index-{now/d-2d}-*>",
});
console.log(response);
# GET /<my-index-{now/d}-*>,<my-index-{now/d-1d}-*>,<my-index-{now/d-2d}-*>/_search
GET /%3Cmy-index-%7Bnow%2Fd%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-1d%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-2d%7D-*%3E/_search

滚动具有一个索引的索引别名

编辑

以下请求创建 <my-index-{now/d}-000001> 及其别名 my-write-alias

resp = client.indices.create(
    index="<my-index-{now/d}-000001>",
    aliases={
        "my-write-alias": {}
    },
)
print(resp)
response = client.indices.create(
  index: '<my-index-{now/d}-000001>',
  body: {
    aliases: {
      "my-write-alias": {}
    }
  }
)
puts response
const response = await client.indices.create({
  index: "<my-index-{now/d}-000001>",
  aliases: {
    "my-write-alias": {},
  },
});
console.log(response);
# PUT <my-index-{now/d}-000001>
PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "my-write-alias": { }
  }
}

以下请求仅在当前索引满足以下一个或多个条件时才滚动别名

  • 索引是 7 天或更早之前创建的。
  • 索引包含 1,000 个或更多文档。
  • 索引的最大主分片为 50GB 或更大。
resp = client.indices.rollover(
    alias="my-write-alias",
    conditions={
        "max_age": "7d",
        "max_docs": 1000,
        "max_primary_shard_size": "50gb",
        "max_primary_shard_docs": "2000"
    },
)
print(resp)
response = client.indices.rollover(
  alias: 'my-write-alias',
  body: {
    conditions: {
      max_age: '7d',
      max_docs: 1000,
      max_primary_shard_size: '50gb',
      max_primary_shard_docs: '2000'
    }
  }
)
puts response
const response = await client.indices.rollover({
  alias: "my-write-alias",
  conditions: {
    max_age: "7d",
    max_docs: 1000,
    max_primary_shard_size: "50gb",
    max_primary_shard_docs: "2000",
  },
});
console.log(response);
POST my-write-alias/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000,
    "max_primary_shard_size": "50gb",
    "max_primary_shard_docs": "2000"
  }
}

API 返回

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "old_index": "my-index-2099.05.06-000001",
  "new_index": "my-index-2099.05.07-000002",
  "rolled_over": true,
  "dry_run": false,
  "lazy": false,
  "conditions": {
    "[max_age: 7d]": false,
    "[max_docs: 1000]": true,
    "[max_primary_shard_size: 50gb]": false,
    "[max_primary_shard_docs: 2000]": false
  }
}

在滚动期间指定设置

编辑

通常,您使用索引模板来自动配置在滚动期间创建的索引。如果要滚动索引别名,请使用滚动 API 添加其他索引设置或覆盖模板中的设置。数据流不支持 settings 参数。

resp = client.indices.rollover(
    alias="my-alias",
    settings={
        "index.number_of_shards": 2
    },
)
print(resp)
response = client.indices.rollover(
  alias: 'my-alias',
  body: {
    settings: {
      'index.number_of_shards' => 2
    }
  }
)
puts response
const response = await client.indices.rollover({
  alias: "my-alias",
  settings: {
    "index.number_of_shards": 2,
  },
});
console.log(response);
POST my-alias/_rollover
{
  "settings": {
    "index.number_of_shards": 2
  }
}