强制合并的功能为强制合并一个或多个索引,目的是通过索引合并达到减少段的数量,通过POST方法执行_forcemerge API。

强制合并请求在没有执行完成之前,请求会一直被阻塞,直到执行完成才会返回,如果期间该HTTP请求由于网络或者其它原因被断开,合并请求将继续在后台执行,直到完成或发生异常结束。如果已经有强制合并正在执行,后续发起的强制合并请求将被会阻塞,直到当前正在执行的合并请求执行完后才执行。

强制合并应该只针对只读索引执行,因为针对可写的索引执行强制合并,可能会导致非常大的段文件生成(每段大于5Gb),且后续的合并策略会自动忽略这样的大文件,由于这些文件后续不能够执行合并操作,可能导致该文件中都是被删除了的文档,最终导演当前分片中存在非常大的段文件。

强制合并可以操作单个索引,也可以操作多个索引,多个索引之间以英文逗号“,”分隔,也可以操作所有索引。

强制合并单个索引,操作如下:

POST /new_index/_forcemerge
{}

强制合并多个索引,操作如下:

POST /new_index,new_index_2/_forcemerge
{}

强制合并全部索引,操作如下:

POST /_forcemerge
{}

 

响应如下:

{
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  }
}

响应显示待处理的总分片数为3个,成功处理3个,失败为0个。

上面的示例都没有带参数,强制合并API可以接收一些参数,用于调整其行为。

强制合并的参数

参数名称

说明

max_num_segments

设置需要合并的段数。如果需要整个索引完全合并,则将该值设置为1。默认情况下会检查合并操作是否需要执行,如果需要才执行,否则就不执行。

only_expunge_deletes

合并过程是否仅操作哪些包含了被删除文档的段,将这些段中未标识为删除的内容放到一个新创建的段中,然后将这些包含了被删除文档的段全部删除。

注:这不会覆盖index.merge.policy.expunge_deletes_allowed阈值。

flush

是否应在强制合并后执行刷新,默认为true。