Refresh、Flush 与 Force Merge

Refresh、Flush 与 Force Merge #

这些是索引的日常维护操作,用于控制数据可见性、持久性和段文件结构。

Refresh:让新写入的文档可搜索 #

写入的文档不会立刻出现在搜索结果中——需要经过一次 refresh 操作,在内存中创建新的 Lucene 段(segment),文档才能被 _search 检索到。

详见 写入与存储机制 了解 refresh 的工作原理。

默认情况下,Easysearch 每 1 秒 自动执行一次 refresh(由 index.refresh_interval 控制)。但你也可以手动触发:

// 刷新特定索引
POST /my-index/_refresh

// 刷新多个索引
POST /index-1,index-2/_refresh

// 刷新所有索引
POST /_refresh

响应:

{
  "_shards": {
    "total": 10,
    "successful": 5,
    "failed": 0
  }
}

查询参数 #

参数类型默认值说明
expand_wildcardsStringopen通配符展开策略
ignore_unavailableBooleanfalse忽略不存在的索引
allow_no_indicesBooleantrue通配符未匹配时是否报错

常见场景 #

  • 批量写入后立即搜索:导入数据后手动 refresh 确保数据可见
  • 测试/CI 环境:写入后立即 refresh 以验证结果

生产环境注意:频繁手动 refresh 会增加小段数量,影响搜索性能。大批量写入时建议临时关闭自动 refresh(设为 "-1"),导入完成后再恢复。

Flush:将数据持久化到磁盘 #

Flush 触发 Lucene 的 commit 操作,将内存中的段写入磁盘,并清空事务日志(translog)。Flush 之后,即使节点崩溃也不会丢失数据。

Easysearch 会自动管理 flush(当 translog 达到 index.translog.flush_threshold_size 时触发),通常不需要手动 flush

// Flush 特定索引
POST /my-index/_flush

// Flush 所有索引
POST /_flush

响应:

{
  "_shards": {
    "total": 10,
    "successful": 5,
    "failed": 0
  }
}

查询参数 #

参数类型默认值说明
forceBooleanfalse即使没有需要提交的变更也强制 flush
wait_if_ongoingBooleantrue如果另一个 flush 正在进行,是否等待而不是立即返回
expand_wildcardsStringopen通配符展开策略
ignore_unavailableBooleanfalse忽略不存在的索引
allow_no_indicesBooleantrue通配符未匹配时是否报错

何时手动 Flush #

  • 在执行滚动重启前,手动 flush 所有索引可以加速节点恢复(减少需要重放的 translog)
  • 在关闭索引之前
// 滚动重启前:flush 所有索引
POST /_flush

Force Merge:合并段文件 #

段合并(merge)会在后台自动进行,但有时你可能需要手动触发强制合并:

  • 将已删除文档从段中清除,释放磁盘空间
  • 将小段合并为大段,提高搜索效率
  • 将只读索引合并为一个段,获得最佳查询性能
// 将索引合并到最多 1 个段
POST /my-index/_forcemerge?max_num_segments=1

// 仅清除已删除文档
POST /my-index/_forcemerge?only_expunge_deletes=true

// 对所有索引执行
POST /_forcemerge?max_num_segments=1

响应:

{
  "_shards": {
    "total": 10,
    "successful": 5,
    "failed": 0
  }
}

查询参数 #

参数类型默认值说明
max_num_segmentsInteger-1(无限制)合并后的最大段数。设为 1 表示完全合并
only_expunge_deletesBooleanfalse仅合并包含已删除文档的段
flushBooleantrue合并完成后是否自动 flush
expand_wildcardsStringopen通配符展开策略
ignore_unavailableBooleanfalse忽略不存在的索引
allow_no_indicesBooleantrue通配符未匹配时是否报错

使用建议 #

场景推荐操作
只读/归档索引max_num_segments=1,获得最佳搜索性能
大量删除后回收空间only_expunge_deletes=true
仍在写入的索引不要 force merge——后台自动合并足够

⚠️ 对正在写入的索引执行 force merge 会导致很大的段产生,后续写入又会产生小段,反而加重合并压力。

清除缓存 #

清除索引级别的缓存(查询缓存、请求缓存、字段数据缓存),释放内存。

// 清除特定索引的所有缓存
POST /my-index/_cache/clear

// 清除所有索引的缓存
POST /_cache/clear

// 只清除特定类型的缓存
POST /my-index/_cache/clear?query=true
POST /my-index/_cache/clear?request=true
POST /my-index/_cache/clear?fielddata=true

// 清除特定字段的字段数据缓存
POST /my-index/_cache/clear?fields=field1,field2

查询参数 #

参数类型默认值说明
queryBoolean是否清除查询缓存
requestBoolean是否清除请求缓存
fielddataBoolean是否清除字段数据缓存
fieldsString逗号分隔的字段名,指定清除哪些字段的缓存
expand_wildcardsStringopen通配符展开策略
ignore_unavailableBooleanfalse忽略不存在的索引
allow_no_indicesBooleantrue通配符未匹配时是否报错

操作对比 #

操作作用性能影响需要手动触发?
Refresh新文档变得可搜索创建新段,增加段数一般不需要
Flush段持久化到磁盘,清空 translog磁盘 IO一般不需要
Force Merge合并段、清除已删除文档CPU + IO 密集只在只读索引上
Cache Clear释放内存中的缓存后续查询需要重建缓存内存压力时

下一步 #