重建数据
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 管理模块 > 重建数据

重新索引数据 #

创建索引后,如果您需要进行广泛的更改,例如为每个文档添加一个新字段或合并多个索引以形成一个新的索引,而不是删除索引,使更改脱机,然后重新索引数据,则可以使用 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 操作将使用默认配置创建新的目标索引。

从远程群集 reindex #

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

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

POST _reindex
{
   "source":{
      "remote":{
         "host":"https://<REST_endpoint_of_remote_cluster>:9200",
         "username":"YOUR_USERNAME",
         "password":"YOUR_PASSWORD"
      }
   },
   "dest":{
      "index":"destination"
   }
}

您可以指定以下选项:

选项有效值描述必填
hostString远程集群的 REST 端点Yes
usernameString登录到远程集群的用户名No
passwordString登录到远程群集的密码No
socket_timeoutTime Unit套接字读取的等待时间(默认为 30 秒)No
connect_timeoutTime Unit远程连接超时的等待时间(默认为 30 秒)No

重新索引文档子集 #

只能复制与搜索查询匹配的特定文档集。

此命令仅将查询操作匹配的文档子集复制到目标索引:

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"
   }
}

重新索引排序的文档 #

对文档中的特定字段进行排序后,可以复制某些文档。

此命令基于 timestamp 字段复制最后 10 个文档:

POST _reindex
{
   "size":10,
   "source":{
      "index":"source",
      "sort":{
         "timestamp":"desc"
      }
   },
   "dest":{
      "index":"destination"
   }
}

重新索引期间转换文档 #

您可以使用 script 选项在重新索引过程中转换数据。 我们建议在 Easysearch 中编写脚本时使用 Painless。

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

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

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

首先必须创建一个定义了 processors 的管道。您可以在 ingest 管道中使用许多不同的 processors

这是一个示例摄取管道,它定义了一个 split 处理器,该处理器基于 space 分隔符拆分 text 字段,并将其存储在新的 word 字段中。 script 处理器是一个无痛脚本,它查找 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

如果在没有参数的情况下运行此命令,则会增加索引中所有文档的版本号。

源索引选项 #

可以为源索引指定以下选项:

选项有效值描述必填
indexString源索引的名称。可以将多个源索引作为列表提供。Yes
max_docsInteger要重新索引的最大文档数。No
queryObject用于重新索引操作的搜索查询。No
sizeInteger要重新索引的文档数。No
sliceString指定手动或自动切片以并行化重新索引。No
sortList重新编制索引之前对文档中的特定字段进行排序。No

目标索引选项 #

可以为目标索引指定以下选项:

选项有效值描述必填
indexString目标索引的名称。Yes
version_typeEnum索引操作的 version 类型。有效值:internal、external、extrnal_gt、external_gte。No