重新索引数据

创建索引后,用户可能需要进行大量更改,例如为每个文档添加新字段或将多个索引合并以形成新索引。与其删除索引、离线更改然后重新索引数据,用户可以使用 reindex 操作。

通过 reindex 操作,用户可以通过查询选择将所有或部分文档复制到另一个索引。重新索引是一个 POST 操作。在其最基本的形式中,用户需要指定源索引和目标索引。

根据源索引的大小,重新索引可能是一个耗时且占用大量资源的操作。我们建议用户在目标索引中通过设置 number_of_replicas0 来禁用副本,并在重新索引过程完成后重新启用它们。

重新索引所有文档

用户可以将一个索引中的所有文档复制到另一个索引。

首先需要创建一个具有所需字段映射和设置的目标索引,或者可以从源索引复制:

PUT destination
{
   "mappings":{
      "Add in your desired mappings"
   },
   "settings":{
      "Add in your desired settings"
   }
}

reindex 命令将源索引中的所有文档复制到目标索引:

POST _reindex
{
   "source":{
      "index":"test-idx"
   },
   "dest":{
      "index":"destination"
   }
}

如果目标索引尚未创建,reindex 操作将创建一个具有默认配置的新目标索引。

从远程集群重新索引

用户可以从远程集群的索引中复制文档。使用 remote 选项指定远程主机名和所需的登录凭据。

此命令连接到远程集群,使用用户名和密码登录,并将该远程集群中的源索引的所有文档复制到本地集群的目标索引:

POST _reindex
{
   "source":{
      "remote":{
         "host":"https://<远程集群的地址>:10200",
         "username":"用户名",
         "password":"密码"
      },
      "index": " 远程集群的索引名"
   },
   "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":"test-idx",
      "query": {
        "match": {
           "field_name": "UDB-SX"
         }
      }
   },
   "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":"test-idx"
   },
   "dest":{
      "index":"destination",
      "op_type":"create"
   }
}

在重新索引期间转换文档

用户可以使用 script 选项在重新索引过程中转换数据。 我们推荐在 UDB-SX 中使用 Painless 进行脚本编写。

此命令在将源索引复制到目标索引之前,通过 Painless 脚本运行,该脚本递增 account 对象内的 number 字段:

POST _reindex
{
   "source":{
      "index":"source"
   },
   "dest":{
      "index":"destination"
   },
   "script":{
      "lang":"painless",
      "source":"ctx._source.account.number++"
   }
}

用户还可以指定一个摄取管道在重新索引过程中转换数据。

首先需要创建一个定义了 processors 的管道。用户有许多不同的 processors 可以在摄取管道中使用。

以下是一个示例摄取管道,它定义了一个 split 处理器,该处理器根据空格分隔符拆分 text 字段,并将其存储在新的 word 字段中。script 处理器是一个 Painless 脚本,它找到 word 字段的长度,并将其存储在新的 word_count 字段中。remove 处理器移除 test 字段。

PUT _ingest/pipeline/pipeline-test
{
"description": "将 text 字段拆分为列表。计算 'word' 字段的长度并将其存储在新的 'word_count' 字段中。移除 'test' 字段。",
"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。