重新索引数据
创建索引后,您可能需要进行大规模更改,例如为每个文档添加新字段或合并多个索引以形成新索引。您可以使用 reindex
操作,而无需删除索引、进行离线更改,然后再次索引数据。
通过 reindex
操作,您可以将通过查询选择的所有或部分文档复制到另一个索引。Reindex 是一个 POST
操作。在其最基本的形式中,您需要指定源索引和目标索引。
重新索引可能是一个代价高昂的操作,具体取决于源索引的大小。建议您通过将 number_of_replicas
设置为 0
来禁用目标索引中的副本,并在重新索引过程完成后重新启用它们。
目录
重新索引所有文档
您可以将所有文档从一个索引复制到另一个索引。
您首先需要创建一个具有所需字段映射和设置的目标索引,或者您可以从源索引复制这些配置。
PUT destination
{
"mappings":{
"Add in your desired mappings"
},
"settings":{
"Add in your desired settings"
}
}
此 reindex
命令将所有文档从源索引复制到目标索引。
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"destination"
}
}
如果目标索引尚未创建,reindex
操作将创建一个具有默认配置的新目标索引。
从远程集群重新索引
您可以从远程集群中的索引复制文档。使用 remote
选项指定远程主机名和所需的登录凭据。
此命令连接到远程集群,使用用户名和密码登录,然后将该远程集群中源索引的所有文档复制到本地集群中的目标索引。
POST _reindex
{
"source":{
"remote":{
"host":"https://<REST_endpoint_of_remote_cluster>:9200",
"username":"YOUR_USERNAME",
"password":"YOUR_PASSWORD"
},
"index": "source"
},
"dest":{
"index":"destination"
}
}
您可以指定以下选项
选项 | 有效值 | 描述 | 必需 |
---|---|---|---|
host | 字符串 | 远程集群的 REST 端点。 | 是 |
username | 字符串 | 登录远程集群的用户名。 | 否 |
password | 字符串 | 登录远程集群的密码。 | 否 |
socket_timeout | 时间单位 | 套接字读取的等待时间(默认为 30 秒)。 | 否 |
connect_timeout | 时间单位 | 远程连接超时的等待时间(默认为 30 秒)。 | 否 |
下表列出了重试策略集群设置。
设置 | 描述 | 默认值 |
---|---|---|
reindex.remote.retry.initial_backoff | 重试的初始退避时间。后续重试将根据初始退避时间采用指数退避策略。 | 500 毫秒 |
reindex.remote.retry.max_count | 最大重试次数。 | 15 |
重新索引部分文档
您可以复制与搜索查询匹配的特定文档集。
此命令仅将查询操作匹配的文档子集复制到目标索引。
POST _reindex
{
"source":{
"index":"source",
"query": {
"match": {
"field_name": "text"
}
}
},
"dest":{
"index":"destination"
}
}
有关所有查询操作的列表,请参阅全文查询。
合并一个或多个索引
您可以通过将源索引作为列表添加来合并一个或多个索引中的文档。
此命令将来自两个源索引的所有文档复制到一个目标索引。
POST _reindex
{
"source":{
"index":[
"source_1",
"source_2"
]
},
"dest":{
"index":"destination"
}
}
确保源索引和目标索引的分片数量相同。
仅重新索引唯一文档
您可以通过将 op_type
选项设置为 create
来仅复制目标索引中缺失的文档。在这种情况下,如果具有相同 ID 的文档已存在,则操作将忽略源索引中的文档。要忽略所有文档的版本冲突,请将 conflicts
选项设置为 proceed
。
POST _reindex
{
"conflicts":"proceed",
"source":{
"index":"source"
},
"dest":{
"index":"destination",
"op_type":"create"
}
}
重新索引期间转换文档
您可以使用 script
选项在重新索引过程中转换数据。我们建议在 OpenSearch 中使用 Painless 进行脚本编写。
此命令通过 Painless 脚本处理源索引,该脚本在将 account
对象中的 number
字段复制到目标索引之前递增其值。
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"destination"
},
"script":{
"lang":"painless",
"source":"ctx._account.number++"
}
}
您还可以指定摄入管道来在重新索引过程中转换数据。
您首先必须创建一个定义了 processors
的管道。您有许多不同的 processors
可用于您的摄入管道。
这是一个示例摄入管道,它定义了一个 split
处理器,该处理器根据 space
分隔符拆分 text
字段并将其存储在新 word
字段中。script
处理器是一个 Painless 脚本,用于查找 word
字段的长度并将其存储在新 word_count
字段中。remove
处理器删除 test
字段。
PUT _ingest/pipeline/pipeline-test
{
"description": "Splits the text field into a list. Computes the length of the 'word' field and stores it in a new 'word_count' field. Removes the 'test' field.",
"processors": [
{
"split": {
"field": "text",
"separator": "\\s+",
"target_field": "word"
}
},
{
"script": {
"lang": "painless",
"source": "ctx.word_count = ctx.word.length"
}
},
{
"remove": {
"field": "test"
}
}
]
}
创建管道后,您可以使用 reindex
操作。
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "destination",
"pipeline": "pipeline-test"
}
}
更新当前索引中的文档
要在当前索引中更新数据而不将其复制到不同索引,请使用 update_by_query
操作。
update_by_query
操作是一个 POST
操作,您可以一次在一个索引上执行。
POST <index_name>/_update_by_query
如果您在没有参数的情况下运行此命令,它将递增索引中所有文档的版本号。
源索引选项
您可以为源索引指定以下选项
选项 | 有效值 | 描述 | 必需 |
---|---|---|---|
index | 字符串 | 源索引的名称。您可以提供多个源索引作为列表。 | 是 |
max_docs | 整数 | 要重新索引的最大文档数。 | 否 |
query | 对象 | 用于重新索引操作的搜索查询。 | 否 |
size | 整数 | 要重新索引的文档数量。 | 否 |
slice | 字符串 | 指定手动或自动切片以并行重新索引。 | 否 |
目标索引选项
您可以为目标索引指定以下选项
选项 | 有效值 | 描述 | 必需 |
---|---|---|---|
index | 字符串 | 目标索引的名称。 | 是 |
version_type | 枚举 | 索引操作的版本类型。有效值:internal、external、external_gt、external_gte。 | 否 |
索引编解码器注意事项
有关索引编解码器注意事项,请参阅索引编解码器。