管理类型映射弃用
本指南提供了在从 Elasticsearch 6.x 或更早版本迁移到 OpenSearch 时,管理类型映射功能废弃的解决方案。
在 Elasticsearch 6.x 之前的版本中,一个索引可以包含多个类型,每个类型都有自己的映射。这些类型允许你在单个索引中存储和查询不同类型的文档,例如书籍和电影。例如,book
和 movie
类型都可以有一个共享字段,如 title
,同时每个类型都有其特定的附加字段。
较新版本的 Elasticsearch 和 OpenSearch 不再支持多种映射类型。现在每个索引只支持一种映射类型。在迁移过程中,你必须定义如何转换或重构使用多种类型的数据。以下示例显示了多种映射类型
GET /library/_mappings
{
"library": {
"mappings": {
"book": {
"properties": {
"title": { "type": "text" },
"pageCount": { "type": "integer" }
}
},
"movie": {
"properties": {
"title": { "type": "text" },
"runTime": { "type": "integer" }
}
}
}
}
}
欲了解更多信息,请参阅 Elasticsearch 关于移除映射类型的官方文档。
使用类型映射转换器
为解决类型映射废弃问题,请使用 TypeMappingsSanitizationTransformer
。此转换器可以修改数据,包括元数据、文档和请求,以便之前映射的数据可以在 OpenSearch 中使用。要使用映射转换器
- 导航到引导箱并使用 Vim 打开
cdk.context.json
文件。 - 添加或更新键
reindexFromSnapshotExtraArgs
,使其包含--doc-transformer-config-file /shared-logs-output/transformation.json
。 - 添加或更新键
trafficReplayerExtraArgs
,使其包含--transformer-config-file /shared-logs-output/transformation.json
。 - 部署迁移助手。
- 导航到迁移助手控制台。
- 创建名为
/shared-logs-output/transformation.json
的文件。 - 将您的转换配置添加到文件中。有关配置选项,请参阅配置选项。
- 运行元数据迁移时,使用命令
console metadata migrate --transformer-config-file /shared-logs-output/transformation.json
通过转换器运行配置。
每当转换配置更新时,需要停止并重新启动回填和重放工具以应用更改。任何先前迁移的数据和元数据可能需要清除以避免不一致的状态。
配置选项
TypeMappingsSanitizationTransformer
支持多种管理类型映射的策略
- 将不同类型路由到单独的索引:将不同类型拆分为各自的索引。
- 将所有类型合并到一个索引中:将多个类型合并到单个索引中。
- 删除特定类型:仅选择性迁移特定类型。
- 保留原始结构:在符合新类型标准的同时,保持相同的索引名称。
类型映射转换器配置模式
类型映射转换器使用以下配置选项。
字段 | 类型 | 必需 | 描述 |
---|---|---|---|
staticMappings | 对象 | 否 | 一个 { indexName: { typeName: targetIndex } } 映射,用于静态路由特定类型。对于此页面上列出的任何索引,其对象中未包含的类型将被删除(对于这些省略的类型,不会迁移任何数据或请求)。 |
regexMappings | 数组 | 否 | 一个基于正则表达式的规则列表,用于将源索引/类型名称动态路由到目标索引。 此数组中的每个元素本身都是一个对象,包含 sourceIndexPattern 、sourceTypePattern 和 targetIndexPattern 字段。有关默认值的信息,请参阅默认值。 |
sourceProperties | 对象 | 是 | 关于源的附加元数据(例如,其 Elasticsearch/OpenSearch 版本)。必须至少包含带有 "major" 和 "minor" 字段的 "version" 。 |
以下示例 JSON 配置提供了转换模式
JSON 配置示例
```JSON { "TypeMappingSanitizationTransformerProvider": { "staticMappings": { "{index-name-1}": { "{type-name-1}": "{target-index-name-1}", "{type-name-2}": "{target-index-name-2}" } }, "regexMappings": [ { "sourceIndexPattern": "{source-index-pattern}", "sourceTypePattern": "{source-type-pattern}", "targetIndexPattern": "{target-index-pattern}" } ], "sourceProperties": { "version": { "major": "NUMBER", "minor": "NUMBER" } } } } ```配置示例
以下配置示例展示了如何针对不同的映射类型场景使用转换器。
将不同类型路由到单独的索引
如果您有一个索引 activity
,其中包含类型 user
和 post
,并且您希望将其拆分为单独的索引,请使用以下配置
[
{
"TypeMappingSanitizationTransformerProvider": {
"staticMappings": {
"activity": {
"user": "new_users",
"post": "new_posts"
}
},
"sourceProperties": {
"version": {
"major": 6,
"minor": 8
}
}
}
}
]
<label hidden class="copy-label">copy</label>
此转换器将执行以下操作
- 将类型为
user
的文档路由到new_users
索引。 - 将类型为
post
的文档路由到new_posts
索引。
将所有类型合并到一个索引中
要将所有类型合并到一个索引中,请使用以下配置
[
{
"TypeMappingSanitizationTransformerProvider": {
"staticMappings": {
"activity": {
"user": "activity",
"post": "activity"
}
},
"sourceProperties": {
"version": {
"major": 6,
"minor": 8
}
}
}
}
]
删除特定类型
要仅迁移 activity
索引中的 user
类型,并删除所有未直接指定的类型的文档/请求,请使用以下配置
[
{
"TypeMappingSanitizationTransformerProvider": {
"staticMappings": {
"activity": {
"user": "users_only"
}
},
"sourceProperties": {
"version": {
"major": 6,
"minor": 8
}
}
}
}
]
此配置仅迁移类型为 user
的文档,并忽略 activity
索引中的其他文档类型。
保留原始结构
要仅迁移特定类型并保留原始结构,请使用以下配置
[
{
"TypeMappingSanitizationTransformerProvider": {
"regexMappings": [
{
"sourceIndexPattern": "(.*)",
"sourceTypePattern": ".*",
"targetIndexPattern": "$1"
}
],
"sourceProperties": {
"version": {
"major": 6,
"minor": 8
}
}
}
}
]
这相当于将所有类型合并到一个索引的策略,但同时也使用了基于模式的路由策略。
组合多种策略
你可以结合静态映射和基于正则表达式的映射,在一次迁移中管理不同的索引或模式。例如,你可能有一个必须使用 staticMappings
的索引,而另一个则使用 regexMappings
按模式路由所有类型。
对于每个文档、请求或元数据项(对于批量请求,单独处理),执行以下步骤
- 检查索引以确定它是否与静态映射中的条目匹配。
- 如果匹配,则根据静态映射条目的索引组件检查类型。
- 如果类型匹配,则应用映射,并且结果索引包含类型键的值。
- 如果类型不匹配,则请求/文档/元数据将被删除,不进行迁移。
- 如果匹配,则根据静态映射条目的索引组件检查类型。
- 如果在静态映射中未找到索引匹配,则按从头到尾的顺序检查索引-类型组合与正则表达式映射列表中的每个项。如果找到匹配项,则应用映射,结果索引包含类型键的值,并且不再执行进一步的正则表达式匹配。
- 任何不符合上述情况的请求、文档或元数据都将被删除,并且其中包含的文档不会被迁移。
以下示例演示了如何为不同的索引组合静态和基于正则表达式的映射
[
{
"TypeMappingSanitizationTransformerProvider": {
"staticMappings": {
"activity": {
"user": "users_activity",
"post": "posts_activity"
},
"logs": {
"error": "logs_error",
"info": "logs_info"
}
},
"regexMappings": [
{
"sourceIndexPattern": "orders.*",
"sourceTypePattern": ".*",
"targetIndexPattern": "all_orders"
}
],
"sourceProperties": {
"version": {
"major": 6,
"minor": 8
}
}
}
}
]
默认值
当转换配置中缺少 regexMappings
键时,regexMappings
将默认为以下内容
{
"regexMappings": [
{
"sourceIndexPattern": "(.+)",
"sourceTypePattern": "_doc",
"targetIndexPattern": "$1"
},
{
"sourceIndexPattern": "(.+)",
"sourceTypePattern": "(.+)",
"targetIndexPattern": "$1_$2"
}
]
}
这使得在 Elasticsearch 6.x 或更高版本中创建的索引能够保留其索引名称,同时将 Elasticsearch 5.x 中创建的索引的类型和索引名称组合起来。如果您希望保留 Elasticsearch 5.x 中创建的索引的索引名称,请使用 staticMappings
选项或使用 regexMappings
选项覆盖类型映射。
限制
使用转换器时,请记住以下限制。
流量重放器
对于流量重放器,仅支持包含类型请求的子集。这些请求列在下表中。
操作 | HTTP 方法 | 端点 | 描述 |
---|---|---|---|
索引(按 ID) | PUT/POST | /{index}/{type}/{id} | 创建或更新具有显式 ID 的单个文档。 |
索引(自动 ID) | PUT/POST | /{index}/{type}/ | 创建自动生成 ID 的单个文档。 |
获取文档 | GET | /{index}/{type}/{id} | 按 ID 检索文档。 |
批量索引/更新/删除 | PUT/POST | /_bulk | 在单个请求中执行多个创建/更新/删除操作。 |
批量索引/更新/删除 | PUT/POST | /{index}/_bulk | 在单个请求中执行多个创建/更新/删除操作,并默认分配索引。 |
批量索引/更新/删除 | PUT/POST | /{index}/{type}/_bulk | 在单个请求中执行多个创建/更新/删除操作,并默认分配索引和类型。 |
创建/更新索引 | PUT/POST | /{index} | 创建或更新索引。 流量重放器不支持拆分行为。请参阅此 GitHub issue 提供反馈或为该功能投票。 |
从快照重新索引
对于 Reindex-From-Snapshot
,在 Elasticsearch 6.x 或更高版本中创建的索引将使用 _doc
作为所有文档的类型,即使在 Elasticsearch 6 中指定了不同的类型。