配置项作用 #
index.refresh_interval 配置项控制索引的刷新间隔,即新索引的文档何时可以被搜索到。刷新操作将内存中的文档写入 Lucene 段并打开新的搜索器,使新文档对搜索可见。
配置项类型 #
该配置项为动态配置,可以在运行时通过索引设置 API 进行修改。
默认值 #
1s(1秒)
是否必需 #
可选配置项(有默认值)
取值范围 #
-1(禁用自动刷新)~ 正无穷
配置格式 #
# 默认配置
index.refresh_interval: 1s
# 实时性要求高
index.refresh_interval: 100ms
# 批量导入优化
index.refresh_interval: 30s
# 禁用自动刷新
index.refresh_interval: -1
工作原理 #
近实时搜索(Near Real-Time Search)通过刷新机制实现:
┌─────────────────────────────────────────────────────────────────┐
│ 文档索引到可搜索流程 │
└─────────────────────────────────────────────────────────────────┘
文档写入
│
▼
┌────────────────────────────────────────────────────────────────┐
│ 内存缓冲区 (Index Buffer) │
│ - 文档在此不可搜索 │
│ - 持续累积文档 │
└────────────────────────────────────────────────────────────────┘
│
│ refresh_interval 后触发
▼
┌────────────────────────────────────────────────────────────────┐
│ Refresh 操作 │
│ 1. 内存缓冲 → 新 Lucene Segment │
│ 2. 打开新 Searcher │
│ 3. 文档变为可搜索 │
└────────────────────────────────────────────────────────────────┘
│
▼
文档可被搜索
刷新机制详解 #
Refresh 流程:
┌─────────────────────────────────────────────────────────────────┐
│ Refresh 触发条件 │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
定时触发 手动触发 文档数阈值
(默认1s) (_refresh API) (可配置)
│ │ │
└───────────────┴───────────────┘
│
▼
执行 Refresh 操作
│
┌───────────────┼───────────────┐
│ │ │
创建新段 打开新 Searcher 旧 Searcher 关闭
│ │ │
└───────────────┴───────────────┘
│
▼
新文档可搜索
使用场景 #
1. 默认配置(大多数场景) #
index.refresh_interval: 1s
- 平衡实时性和性能
- 适用于大多数业务场景
- 1秒延迟通常可接受
2. 高实时性要求 #
index.refresh_interval: 100ms
适用场景:
- 实时日志分析
- 实时监控告警
- 即时通讯系统
- 金融交易数据
代价:
- 增加 CPU 使用率
- 产生更多小段
- 降低索引吞吐量
3. 批量导入优化 #
index.refresh_interval: 30s
适用场景:
- 大数据批量导入
- 历史数据迁移
- 离线数据重建索引
效果:
- 显著提高索引吞吐量
- 减少段文件数量
- 降低 CPU 使用率
4. 极限性能场景 #
# 导入期间禁用刷新
index.refresh_interval: -1
# 完成后恢复
index.refresh_interval: 1s
警告: 禁用刷新后,新文档不会自动变为可搜索,必须手动调用刷新 API。
使用示例 #
创建索引时设置:
PUT /my_index
{
"settings": {
"index.refresh_interval": "5s"
}
}
动态修改:
# 修改为更长间隔以提高索引性能
PUT /my_index/_settings
{
"index.refresh_interval": "30s"
}
# 修改为更短间隔以提高实时性
PUT /my_index/_settings
{
"index.refresh_interval": "500ms"
}
# 禁用自动刷新
PUT /my_index/_settings
{
"index.refresh_interval": "-1"
}
手动触发刷新:
# 刷新特定索引
POST /my_index/_refresh
# 刷新多个索引
POST /index1,index2/_refresh
# 刷新所有索引
POST /_refresh
# 等待刷新完成
POST /my_index/_refresh?wait_for_refresh=true
推荐设置建议 #
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 默认/通用 | 1s | 平衡性能和实时性 |
| 高实时性 | 100ms-500ms | 实时搜索场景 |
| 日志/指标 | 5s-10s | 可容忍一定延迟 |
| 批量导入 | 30s-60s | 提高吞吐量 |
| 大规模导入 | -1 | 导入完成后手动刷新 |
性能影响分析 #
| refresh_interval | 索引吞吐量 | 搜索实时性 | 段数量 | CPU 使用 |
|---|---|---|---|---|
| 100ms | 低 | 高 | 多 | 高 |
| 1s | 中 | 中 | 中 | 中 |
| 5s | 高 | 低 | 少 | 低 |
| 30s | 很高 | 很低 | 很少 | 很低 |
| -1 | 最高 | 无 | 最少 | 最低 |
与 translog 的关系 #
文档写入流程:
│
▼
写入 Translog
│ (持久化保证)
▼
写入内存缓冲区
│
▼
等待 refresh_interval
│
▼
Refresh 操作
│
▼
文档可搜索
Translog 持久化配置:
- index.translog.durability: async (异步,默认)
- index.translog.durability: request (同步,更安全)
批量导入最佳实践 #
# 1. 导入前优化配置
PUT /my_index/_settings
{
"index.refresh_interval": "-1",
"index.number_of_replicas": 0,
"index.translog.durability": "async"
}
# 2. 执行批量导入
# (使用 bulk API 批量写入数据)
# 3. 导入后恢复配置
PUT /my_index/_settings
{
"index.refresh_interval": "1s",
"index.number_of_replicas": 1,
"index.translog.durability": "request"
}
# 4. 手动触发刷新
POST /my_index/_refresh
# 5. 强制合并段(可选)
POST /my_index/_forcemerge?max_num_segments=1
监控建议 #
# 查看刷新配置
GET /my_index/_settings?filter_path=*.index.refresh_interval
# 查看索引统计
GET /my_index/_stats?pretty
# 查看刷新耗时
GET /_nodes/stats/indices?filter_path=**.refresh
关键指标:
| 指标 | 说明 |
|---|---|
| refresh.total | 总刷新次数 |
| refresh.time | 总刷新耗时 |
| refresh.listeners | 当前刷新监听器数 |
| total.refresh_time | 平均刷新时间 |
常见问题 #
问题 1:新文档搜索不到
可能原因:
- refresh_interval 未到
- 设置了
-1禁用自动刷新
解决方案:
# 手动刷新
POST /my_index/_refresh
# 或降低刷新间隔
PUT /my_index/_settings
{
"index.refresh_interval": "500ms"
}
问题 2:索引性能差
可能原因:
- refresh_interval 设置过短
- 频繁刷新消耗资源
解决方案:
# 增加刷新间隔
PUT /my_index/_settings
{
"index.refresh_interval": "10s"
}
问题 3:段文件过多
原因: 频繁刷新产生大量小段
解决方案:
# 1. 增加 refresh_interval
PUT /my_index/_settings
{
"index.refresh_interval": "30s"
}
# 2. 配置强制合并
POST /my_index/_forcemerge?max_num_segments=1
注意事项 #
- 动态更新:此配置为动态配置,可在线修改
- 实时性权衡:刷新越频繁,实时性越好但性能越低
- 段合并:频繁刷新会产生更多小段,增加合并压力
- 手动刷新:禁用自动刷新后需手动调用
_refreshAPI - 副本影响**:副本也需要刷新,可能增加总体刷新时间
- translog 配合**:与 translog 配置配合可进一步优化性能





