

# 处理索引的重大更改
<a name="opensearch-for-dynamodb-change-index"></a>

OpenSearch 可以动态地向您的索引添加新属性。但是，在为给定键设置映射模板后，您需要采取其它措施来对其进行更改。此外，如果您的更改要求您重新处理 DynamoDB 表中的所有数据，则需要采取相应的步骤来启动新的导出。

**注意**  
在所有这些选项中，如果您的 DynamoDB 表与您指定的映射模板存在类型冲突，您可能仍会遇到问题。确保启用死信队列（DLQ）（即使在开发环境中也是如此）。这样可以更轻松地了解在 OpenSearch 上将记录编入索引中时可能导致冲突的记录问题。

**Topics**
+ [工作原理](#opensearch-for-dynamodb-change-index-howitworks)
+ [删除索引并重置管道（以管道为中心的选项）](#opensearch-for-dynamodb-change-index-delete)
+ [重新创建索引并重置管道（以索引为中心的选项）](#opensearch-for-dynamodb-change-index-recreate)
+ [创建新的索引并接收（在线选项）](#opensearch-for-dynamodb-change-index-create)
+ [避免和调试类型冲突的最佳实践](#opensearch-for-dynamodb-change-index-bp)

## 工作原理
<a name="opensearch-for-dynamodb-change-index-howitworks"></a>

下面简要概述了处理索引重大更改时所采取的操作。请参阅以下各节中的分步过程。
+ **停止并启动管道**：此选项会重置管道的状态，并且管道将以新的完整导出重新启动。它是非破坏性的，因此它**不会**删除您的索引或 DynamoDB 中的任何数据。如果在执行此操作之前没有创建新的索引，则可能会看到大量版本冲突导致的错误，因为导出操作会尝试在索引中插入比当前 `_version` 版本更旧的文档。这些错误完全可以忽略。当管道停止时，您无需支付管道的费用。
+ **更新管道**：此选项使用[蓝/绿](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html)方法更新管道中的配置，而不会丢失任何状态。如果您对管道进行了重大更改（例如向现有索引添加新的路由、索引或键），则可能需要完全重置管道并重新创建索引。此选项**不**执行完整导出。
+ **删除并重新创建索引**：此选项会删除索引上的数据和映射设置。在对映射进行任何重大更改之前，应先执行此操作。它将破坏所有依赖该索引的应用程序，直至重新创建和同步索引。删除索引**不会**启动新的导出。只有在更新管道之后，才应删除索引。否则，可能会在更新设置之前重新创建索引。

## 删除索引并重置管道（以管道为中心的选项）
<a name="opensearch-for-dynamodb-change-index-delete"></a>

如果您仍处于开发中，这种方法通常是最快的选择。您将在 OpenSearch Service 中删除索引，然后[停止并启动](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline--stop-start.html)管道，启动所有数据的全新导出。这样可以确保与现有索引没有映射模板冲突，也不会丢失未完成处理的表中的数据。

1. 通过 AWS 管理控制台、或结合 AWS CLI 或 SDK 使用 StopPipeline API 操作来停止管道。

1. 用新的更改[更新您的管道配置](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/update-pipeline.html)。

1. 通过 `REST` API 调用或通过 OpenSearch 控制面板删除您在 OpenSearch Service 中的索引。

1. 通过控制台、或结合 AWS CLI 或 SDK 使用 `StartPipeline` API 操作来停止管道。
**注意**  
这将启动新的完整导出，会产生额外费用。

1. 监控是否存在任何意外问题，因为会生成新的导出来创建新索引。

1. 确认该索引符合您在 OpenSearch Service 中的预期。

导出完成并恢复从流中读取后，您的 DynamoDB 表数据现在将在索引中可用。

## 重新创建索引并重置管道（以索引为中心的选项）
<a name="opensearch-for-dynamodb-change-index-recreate"></a>

如果您需要在从 DynamoDB 恢复管道之前，在 OpenSearch Service 中对索引设计执行大量迭代，则此方法效果很好。当您想非常快速地迭代搜索模式，并且希望避免在每次迭代之间等待新的导出完成时，这对于开发很有用。

1. 通过 AWS 管理控制台、或通过结合 AWS CLI 或 SDK 调用 StopPipeline API 操作来停止管道。

1. 借助要使用的映射模板在 OpenSearch 中删除并重新创建索引。您可以手动插入一些示例数据，以确认您的搜索是否按预期进行。如果您的示例数据可能与 DynamoDB 中的任何数据存在冲突，请务必将其删除后再继续下一步。

1. 如果您的管道中有索引模板，请将其删除或替换为在 OpenSearch Service 中创建的索引模板。确保索引的名称与管道中的名称相匹配。

1. 通过控制台、或结合 AWS CLI 或 SDK 调用 `StartPipeline` API 操作来停止管道。
**注意**  
这将启动新的完整导出，将会产生额外费用。

1. 监控是否存在任何意外问题，因为会生成新的导出来创建新索引。

导出完成并恢复从流中读取后，您的 DynamoDB 表数据现在便在索引中可用。

## 创建新的索引并接收（在线选项）
<a name="opensearch-for-dynamodb-change-index-create"></a>

如果您需要更新映射模板，但目前正在生产中使用索引，则此方法效果很好。这将创建一个全新的索引，在进行同步和验证后，您需要将应用程序切换至该索引。

**注意**  
这将在流中创建另一个使用者。如果您还有其它使用者（如 AWS Lambda 或全局表），则可能会出现问题。您可能需要暂停对现有管道的更新，来创建加载新索引的容量。

1. 使用新设置和不同的索引名称[创建新管道](OpenSearchIngestionForDynamoDB.md#opensearch-for-dynamodb-console-create)。

1. 监控新索引是否存在任何意外问题。

1. 将应用程序切换至新索引。

1. 在验证一切正常后，停止并删除旧管道。

## 避免和调试类型冲突的最佳实践
<a name="opensearch-for-dynamodb-change-index-bp"></a>
+ 当存在类型冲突时，请务必使用死信队列（DLQ），其有助于更轻松地进行调试。
+ 始终使用带有映射的索引模板并设置 `include_keys`。虽然 OpenSearch Service 会动态映射新键，但这可能会导致出现意外行为（例如预期某些内容为 `GeoPoint`，但却创建为 `string` 或 `object`）或错误（例如 `number` 混合了 `long` 和 `float` 值）。
+ 如果您需要在生产环境中保持现有索引正常运行，也可以替换之前的任何[删除索引步骤](#opensearch-for-dynamodb-change-index-delete)，只在管道配置文件中重命名索引。这将创建一个全新的索引。然后在完成后，您的应用程序需要更新，以指向新索引。
+ 如果您使用处理器修复了类型转换问题，则可以用 `UpdatePipeline` 对此进行测试。为此，您需要停止并启动或[处理死信队列](https://opensearch.org/docs/latest/data-prepper/pipelines/dlq/)，以修复之前跳过的任何存在错误的文档。