Link Search Menu Expand Document Documentation Menu

强制合并

1.0 版引入

强制合并 API 操作强制对一个或多个索引的分片进行合并。对于数据流,该 API 强制对数据流的后端索引的分片进行合并。

端点

POST /_forcemerge
POST /<index>/_forcemerge/

合并操作

在 OpenSearch 中,分片是一个 Lucene 索引,它由*段*(或段文件)组成。段存储索引数据。较小的段会定期合并为较大的段,较大的段变得不可变。合并操作减少了每个分片的段总数,并释放了磁盘空间。

OpenSearch 执行后台段合并,生成的段大小不超过 index.merge.policy.max_merged_segment(默认为 5 GB)。

已删除文档

当从 OpenSearch 索引中删除文档时,它不会从 Lucene 段中删除,而只是被标记为待删除。当段文件合并时,已删除的文档会被移除(或*清除*)。因此,合并也会释放被标记为已删除文档所占用的空间。

强制合并 API

除了定期合并之外,您还可以使用强制合并 API 强制进行段合并。

仅当发送到索引的所有写入请求都完成后,才能对索引使用强制合并 API。强制合并操作可能会产生非常大的段。如果仍有写入请求发送到索引,则合并策略不会合并这些段,直到它们主要由已删除的文档组成。这可能会增加磁盘空间使用量并导致性能下降。

当您调用强制合并 API 时,该调用会被阻塞,直到合并完成。如果在此期间连接丢失,强制合并操作会在后台继续进行。发送到同一索引的新强制合并请求将被阻塞,直到当前运行的合并操作完成。

强制合并多个索引

要强制合并多个索引,您可以在以下索引组合上调用强制合并 API

  • 多个索引
  • 包含多个后端索引的一个或多个数据流
  • 指向多个索引的一个或多个索引别名
  • 集群中的所有数据流和索引

当您强制合并多个索引时,合并操作会在节点的每个分片上按顺序执行。当强制合并操作正在进行时,分片的存储空间会暂时增加,以便所有段都可以重写到一个新段中。当 max_num_segments 设置为 1 时,分片的存储空间会暂时翻倍。

强制合并数据流

强制合并数据流对于管理数据流的后端索引非常有用,尤其是在滚动操作之后。基于时间的索引仅在指定时间段内接收索引请求。一旦该时间段结束且索引不再接收写入请求,您可以强制将所有索引分片的段合并为一个段。在单段分片上的搜索效率更高,因为它们使用更简单的数据结构。

路径参数

下表列出了可用的路径参数。所有路径参数均为可选。

参数 数据类型 描述
<索引> 字符串 逗号分隔的索引、数据流或索引别名列表,操作将应用于这些对象。支持通配符表达式 (*)。使用 _all* 指定集群中的所有索引和数据流。

查询参数

下表列出了可用的查询参数。所有查询参数都是可选的。

参数 数据类型 描述
allow_no_indices 布尔型 如果为 false,则如果任何通配符表达式或索引别名指向任何已关闭或缺失的索引,请求将返回错误。默认值为 true
expand_wildcards 字符串 指定通配符表达式可以扩展到的索引类型。支持逗号分隔值。有效值包括
- all:扩展到所有开放和关闭的索引,包括隐藏索引。
- open:扩展到开放索引。
- closed:扩展到关闭索引。
- hidden:扩展时包含隐藏索引。必须与 openclosed 或两者结合使用。
- none:不接受通配符表达式。
默认值为 open
flush 布尔型 在强制合并后对索引执行刷新。刷新确保文件持久化到磁盘。默认值为 true
ignore_unavailable 布尔型 如果为 true,OpenSearch 会忽略缺失或已关闭的索引。如果为 false,如果强制合并操作遇到缺失或已关闭的索引,OpenSearch 将返回错误。默认值为 false
max_num_segments 整数 较小段合并成的较大段的数量。将此参数设置为 1 以将所有段合并为一个段。默认行为是按需执行合并。
only_expunge_deletes 布尔型 如果为 true,合并操作仅清除包含一定百分比已删除文档的段。默认百分比为 10%,可在 index.merge.policy.expunge_deletes_allowed 设置中配置。在 OpenSearch 2.12 之前,only_expunge_deletes 会忽略 index.merge.policy.max_merged_segment 设置。从 OpenSearch 2.12 开始,使用 only_expunge_deletes 不会生成大于 index.merge.policy.max_merged_segment(默认为 5 GB)的段。更多信息,请参阅已删除文档。默认值为 false
primary_only 布尔型 如果设置为 true,则合并操作仅在索引的主分片上执行。当您希望在合并完成后拍摄索引快照时,这会很有用。快照仅从主分片复制段。合并主分片可以减少资源消耗。默认值为 false

示例请求

以下示例展示如何使用强制合并 API。

强制合并特定索引

以下示例强制合并特定索引

POST /testindex1/_forcemerge

强制合并多个索引

以下示例强制合并多个索引

POST /testindex1,testindex2/_forcemerge

强制合并所有索引

以下示例强制合并所有索引

POST /_forcemerge

将数据流的后端索引强制合并为一个段

以下示例将数据流的后端索引强制合并为一个段

POST /.testindex-logs/_forcemerge?max_num_segments=1

强制合并主分片

以下示例强制合并索引的主分片

POST /.testindex-logs/_forcemerge?primary_only=true

示例响应

{
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

响应正文字段

下表列出了所有响应字段。

字段 数据类型 描述
分片 对象 包含有关请求执行所在分片的信息。
shards.total 整数 操作执行所在分片的总数。
shards.successful 整数 操作成功执行所在分片的数量。
shards.failed 整数 操作失败的分片数量。