强制合并
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 :扩展时包含隐藏索引。必须与 open 、closed 或两者结合使用。- 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 | 整数 | 操作失败的分片数量。 |