加载中

修改数据流

每个数据流都有一个匹配的索引模板。此模板中的映射和索引设置会应用于为该流创建的新后备索引。这包括该流的第一个后备索引,该索引是在创建流时自动生成的。

在创建数据流之前,我们建议您仔细考虑在此模板中包含哪些映射和设置。

如果您稍后需要更改数据流的映射或设置,您有以下几种选择:

提示

如果您的更改包括修改现有字段映射或静态索引设置,通常需要进行重新索引(reindex)才能将更改应用到数据流的后备索引。如果您已经在执行重新索引,您可以使用相同的过程来添加新的字段映射并更改动态索引设置。请参见使用重新索引更改映射或设置

要将新字段的映射添加到数据流中,请执行以下步骤:

  1. 更新数据流使用的索引模板。这确保了新的字段映射会添加至为该流创建的未来后备索引中。

    例如,my-data-stream-templatemy-data-stream 使用的现有索引模板。

    以下创建或更新索引模板请求将新字段 message 的映射添加到模板中。

    				PUT /_index_template/my-data-stream-template
    					{
      "index_patterns": [ "my-data-stream*" ],
      "data_stream": { },
      "priority": 500,
      "template": {
        "mappings": {
          "properties": {
            "message": {
              "type": "text"
            }
          }
        }
      }
    }
    		
    1. 为新字段 message 添加映射。
  2. 使用更新映射 API 将新字段映射添加到数据流。默认情况下,这会将映射添加到该流现有的后备索引中,包括写索引。

    以下更新映射 API 请求将新的 message 字段映射添加到 my-data-stream 中。

    				PUT /my-data-stream/_mapping
    					{
      "properties": {
        "message": {
          "type": "text"
        }
      }
    }
    		

    若只想将映射添加到该流的写索引中,请将更新映射 API 的 write_index_only 查询参数设置为 true

    以下更新映射请求仅将新的 message 字段映射添加到 my-data-stream 的写索引中。新字段映射不会添加到该流的其他后备索引中。

    				PUT /my-data-stream/_mapping?write_index_only=true
    					{
      "properties": {
        "message": {
          "type": "text"
        }
      }
    }
    		
提示

您还可以在 Kibana 中向数据流添加新字段映射。在流 (Streams) 页面上找到数据流(其中的流直接映射到数据流)。选择一个流以查看其详细信息,然后转到 Schema 选项卡以添加新字段。

每个映射参数的文档都指出了是否可以使用更新映射 API 为现有字段更新它。要为现有字段更新这些参数,请执行以下步骤:

  1. 更新数据流使用的索引模板。这确保了更新后的字段映射会添加至为该流创建的未来后备索引中。

    例如,my-data-stream-templatemy-data-stream 使用的现有索引模板。

    以下创建或更新索引模板请求将 host.ip 字段的 ignore_malformed 映射参数的参数值更改为 true

    				PUT /_index_template/my-data-stream-template
    					{
      "index_patterns": [ "my-data-stream*" ],
      "data_stream": { },
      "priority": 500,
      "template": {
        "mappings": {
          "properties": {
            "host": {
              "properties": {
                "ip": {
                  "type": "ip",
                  "ignore_malformed": true
                }
              }
            }
          }
        }
      }
    }
    		
    1. host.ip 字段的 ignore_malformed 值更改为 true
  2. 使用更新映射 API 将映射更改应用到数据流。默认情况下,这会将更改应用到该流现有的后备索引中,包括写索引。

    以下更新映射 API 请求以 my-data-stream 为目标。该请求将 host.ip 字段的 ignore_malformed 映射参数的参数值更改为 true

    				PUT /my-data-stream/_mapping
    					{
      "properties": {
        "host": {
          "properties": {
            "ip": {
              "type": "ip",
              "ignore_malformed": true
            }
          }
        }
      }
    }
    		

    若只想将映射更改应用到该流的写索引,请将 put mapping API 的 write_index_only 查询参数设置为 true

    以下更新映射请求仅更改 my-data-stream 写索引的 host.ip 字段映射。此更改不会应用到该流的其他后备索引。

    				PUT /my-data-stream/_mapping?write_index_only=true
    					{
      "properties": {
        "host": {
          "properties": {
            "ip": {
              "type": "ip",
              "ignore_malformed": true
            }
          }
        }
      }
    }
    		
提示

您还可以在 Kibana 中更新现有字段的映射。在流 (Streams) 页面上找到数据流(其中的流直接映射到数据流)。选择该流以查看其详细信息,然后转到 Schema 选项卡进行更新。有关更多信息,请参阅流中的映射字段

除了支持的映射参数外,我们不建议您更改现有字段的映射或字段数据类型,即使在数据流的匹配索引模板或其后备索引中也是如此。更改现有字段的映射可能会使任何已索引的数据失效。

如果您需要更改现有字段的映射,请创建一个新的数据流并将数据重新索引到其中。请参见使用重新索引更改映射或设置

要更改数据流的动态索引设置,请执行以下步骤:

  1. 更新数据流使用的索引模板。这确保了该设置会应用至为该流创建的未来后备索引中。

    例如,my-data-stream-templatemy-data-stream 使用的现有索引模板。

    以下创建或更新索引模板请求将模板的 index.refresh_interval 索引设置更改为 30s(30 秒)。

    				PUT /_index_template/my-data-stream-template
    					{
      "index_patterns": [ "my-data-stream*" ],
      "data_stream": { },
      "priority": 500,
      "template": {
        "settings": {
          "index.refresh_interval": "30s"
        }
      }
    }
    		
    1. index.refresh_interval 设置更改为 30s(30 秒)。
  2. 使用更新索引设置 API 更新数据流的索引设置。默认情况下,这会将设置应用到该流现有的后备索引中,包括写索引。

    以下更新索引设置 API 请求更新 my-data-streamindex.refresh_interval 设置。

    				PUT /my-data-stream/_settings
    					{
      "index": {
        "refresh_interval": "30s"
      }
    }
    		
重要提示

要更改 index.lifecycle.name 设置,请首先使用移除策略 API 移除现有的 ILM 策略。请参见切换生命周期策略

提示

您还可以在 Kibana 中更新数据流的某些动态索引设置,例如分片数、副本数以及使用的刷新间隔。

流 (Streams) 页面上找到数据流(其中的流直接映射到数据流)。选择该流以查看其详细信息,然后转到 Advanced 选项卡进行调整。有关更多信息,请参阅配置流的高级设置 > 索引配置

静态索引设置只能在创建后备索引时进行设置。您无法使用更新索引设置 API 来更新静态索引设置。

要将新的静态设置应用到未来的后备索引,请更新数据流使用的索引模板。该设置会自动应用到更新后创建的任何后备索引。

例如,my-data-stream-templatemy-data-stream 使用的现有索引模板。

以下创建或更新索引模板 API 请求将新的 sort.fieldsort.order 索引设置添加到模板中。

				PUT /_index_template/my-data-stream-template
					{
  "index_patterns": [ "my-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "settings": {
      "sort.field": [ "@timestamp"],
      "sort.order": [ "desc"]
    }
  }
}
		
  1. 添加 sort.field 索引设置。
  2. 添加 sort.order 索引设置。

如果需要,您可以滚动更新(roll over)数据流,以便立即将该设置应用到数据流的写索引。这会影响滚动更新后添加到流中的任何新数据。但是,它不会影响数据流现有的后备索引或现有数据。

要将静态设置更改应用到现有的后备索引,您必须创建一个新的数据流并将您的数据重新索引到其中。请参见使用重新索引更改映射或设置

有关更新 number_of_shards 的演练,请参阅此视频

您可以使用重新索引来更改数据流的映射或设置。更改现有字段的数据类型或更新后备索引的静态索引设置时,通常需要这样做。

要重新索引数据流,请首先创建或更新索引模板,使其包含所需的映射或设置更改。然后,您可以将现有的数据流重新索引到与该模板匹配的新流中。这会将模板中的映射和设置更改应用到添加到新数据流中的每个文档和后备索引。这些更改还会影响由新流创建的任何未来后备索引。

请遵循以下步骤

  1. 为新数据流选择名称或索引模式。这个新数据流将包含来自现有流的数据。

    您可以使用解析索引 API 来检查该名称或模式是否与任何现有索引、别名或数据流匹配。如果是,您应该考虑使用其他名称或模式。

    以下解析索引 API 请求检查以 new-data-stream 开头的任何现有索引、别名或数据流。如果没有,则可以使用 new-data-stream* 索引模式来创建新的数据流。

    				GET /_resolve/index/new-data-stream*
    		

    该 API 返回以下响应,表明没有现有目标与此模式匹配。

    {
      "indices": [ ],
      "aliases": [ ],
      "data_streams": [ ]
    }
    		
  2. 创建或更新索引模板。此模板应包含您想要应用到新数据流的后备索引中的映射和设置。

    此索引模板必须满足数据流模板的要求。它还应在其 index_patterns 属性中包含您先前选择的名称或索引模式。

    提示

    如果您只是添加或更改少许内容,我们建议您通过复制现有模板并根据需要进行修改来创建一个新模板。

    例如,my-data-stream-templatemy-data-stream 使用的现有索引模板。

    以下创建或更新索引模板 API 请求创建一个新的索引模板 new-data-stream-templatenew-data-stream-templatemy-data-stream-template 为基础,并进行了以下更改:

    • index_patterns 中的索引模式匹配任何以 new-data-stream 开头的索引或数据流。
    • @timestamp 字段映射使用的是 date_nanos 字段数据类型,而不是 date 数据类型。
    • 该模板包含原 my-data-stream-template 模板中没有的 sort.fieldsort.order 索引设置。
    				PUT /_index_template/new-data-stream-template
    					{
      "index_patterns": [ "new-data-stream*" ],
      "data_stream": { },
      "priority": 500,
      "template": {
        "mappings": {
          "properties": {
            "@timestamp": {
              "type": "date_nanos"
            }
          }
        },
        "settings": {
          "sort.field": [ "@timestamp"],
          "sort.order": [ "desc"]
        }
      }
    }
    		
    1. @timestamp 字段映射更改为 date_nanos 字段数据类型。
    2. 添加 sort.field 索引设置。
    3. 添加 sort.order 索引设置。
  3. 使用创建数据流 API 手动创建新的数据流。数据流的名称必须与新模板的 index_patterns 属性中定义的索引模式相匹配。

    我们不建议通过索引新数据来创建此数据流。随后,您会将现有数据流中的旧数据重新索引到这个新流中。这可能会导致一个或多个后备索引包含新旧混合的数据。

    重要提示

    在数据流中混合新旧数据

    虽然混合新旧数据是安全的,但它可能会干扰数据保留(retention)。如果您删除较旧的索引,可能会意外删除包含新旧数据的后备索引。为了防止过早丢失数据,您需要保留此类后备索引,直到准备好删除其最新数据为止。

    以下创建数据流 API 请求以 new-data-stream 为目标,该目标与 new-data-stream-template 的索引模式匹配。由于没有现有索引或数据流使用此名称,此请求将创建 new-data-stream 数据流。

    				PUT /_data_stream/new-data-stream
    		
  4. 如果您不想在新的数据流中混合新旧数据,请暂停新文档的索引。虽然混合新旧数据是安全的,但它可能会干扰数据保留。请参见在数据流中混合新旧数据

  5. 如果您使用 ILM 自动化滚动更新,请减少 ILM 轮询间隔。这可确保当前的写索引在等待滚动更新检查时不会变得太大。默认情况下,ILM 每 10 分钟检查一次滚动更新条件。

    以下集群更新设置 API 请求将 indices.lifecycle.poll_interval 设置降低至 1m(一分钟)。

    				PUT /_cluster/settings
    					{
      "persistent": {
        "indices.lifecycle.poll_interval": "1m"
      }
    }
    		
  6. 使用 createop_type 将数据重新索引到新的数据流中。

    如果您想按照最初索引数据的顺序对数据进行分区,可以运行单独的重新索引请求。这些重新索引请求可以使用各个后备索引作为源。您可以使用获取数据流 API 来检索后备索引列表。

    例如,您计划将数据从 my-data-stream 重新索引到 new-data-stream 中。但是,您希望为 my-data-stream 中的每个后备索引分别提交一个重新索引请求,从最旧的后备索引开始。这保留了最初索引数据的顺序。

    以下获取数据流 API 请求检索有关 my-data-stream 的信息,包括其后备索引列表。

    				GET /_data_stream/my-data-stream
    		

    响应的 indices 属性包含该流当前后备索引的数组。数组中的第一项包含有关该流最旧后备索引的信息。

    {
      "data_streams": [
        {
          "name": "my-data-stream",
          "timestamp_field": {
            "name": "@timestamp"
          },
          "indices": [
            {
              "index_name": ".ds-my-data-stream-2099.03.07-000001",
              "index_uuid": "Gpdiyq8sRuK9WuthvAdFbw",
              "prefer_ilm": true,
              "managed_by": "Unmanaged"
            },
            {
              "index_name": ".ds-my-data-stream-2099.03.08-000002",
              "index_uuid": "_eEfRrFHS9OyhqWntkgHAQ",
              "prefer_ilm": true,
              "managed_by": "Unmanaged"
            }
          ],
          "generation": 2,
          "status": "GREEN",
          "next_generation_managed_by": "Unmanaged",
          "prefer_ilm": true,
          "template": "my-data-stream-template",
          "hidden": false,
          "system": false,
          "allow_custom_routing": false,
          "replicated": false,
          "rollover_on_write": false
        }
      ]
    }
    		
    1. my-data-streamindices 数组中的第一项。此项包含有关该流最旧后备索引 .ds-my-data-stream-2099.03.07-000001 的信息。

    以下重新索引 API 请求将文档从 .ds-my-data-stream-2099.03.07-000001 复制到 new-data-stream。该请求的 op_typecreate

    				POST /_reindex
    					{
      "source": {
        "index": ".ds-my-data-stream-2099.03.07-000001"
      },
      "dest": {
        "index": "new-data-stream",
        "op_type": "create"
      }
    }
    		

    您还可以使用查询来让每个请求仅重新索引文档的一个子集。

    以下重新索引 API 请求将文档从 my-data-stream 复制到 new-data-stream。该请求使用 range 查询来仅重新索引时间戳在最近一周内的文档。请注意,该请求的 op_typecreate

    				POST /_reindex
    					{
      "source": {
        "index": "my-data-stream",
        "query": {
          "range": {
            "@timestamp": {
              "gte": "now-7d/d",
              "lte": "now/d"
            }
          }
        }
      },
      "dest": {
        "index": "new-data-stream",
        "op_type": "create"
      }
    }
    		
  7. 如果您之前更改了 ILM 轮询间隔,请在重新索引完成后将其改回原始值。这可以防止对主节点造成不必要的负载。

    以下集群更新设置 API 请求将 indices.lifecycle.poll_interval 设置重置为其默认值。

    				PUT /_cluster/settings
    					{
      "persistent": {
        "indices.lifecycle.poll_interval": null
      }
    }
    		
  8. 使用新的数据流恢复索引。对此流的搜索现在将查询您的新数据和重新索引的数据。

  9. 验证所有重新索引的数据在新的数据流中都可用后,您可以安全地删除旧流。

    以下删除数据流 API 请求删除 my-data-stream。此请求还会删除该流的后备索引及其中包含的任何数据。

    				DELETE /_data_stream/my-data-stream
    		

使用别名 API 更新现有数据流的别名。更改其索引模式中现有数据流的别名没有效果。

例如,logs 别名指向单个数据流。以下请求为该别名交换流。在此交换期间,logs 别名没有停机时间,且绝不会同时指向两个流。

				POST _aliases
					{
  "actions": [
    {
      "remove": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    },
    {
      "add": {
        "index": "logs-my_app-default",
        "alias": "logs"
      }
    }
  ]
}
		

使用修改 API 修改数据流的后备索引。可以在单个修改请求中指定多个操作,并且这些操作将以原子方式执行。

				POST /_data_stream/_modify
					{
  "actions": [
    {
      "add_backing_index": {
        "data_stream": "my-data-stream",
        "index": "new-index"
      },
      "remove_backing_index": {
        "data_stream": "my-data-stream",
        "index": "old-index"
      }
    }
  ]
}
		
© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.