刷新索引,使自上次刷新以来执行的所有操作对搜索可见。
API #
POST /_refresh
GET /_refresh
POST /{index}/_refresh
GET /{index}/_refresh
API 的作用 #
该 API 用于刷新索引,使最近索引的文档对搜索可见。这是 Easysearch 近实时搜索功能的核心机制。
刷新的作用 #
- 将内存中的文档写入新的段
- 使新文档可被搜索
- 不保证数据持久化到磁盘
- 默认情况下,Easysearch 会定期自动刷新索引
Refresh vs Flush #
| 操作 | 描述 | 持久化 |
|---|---|---|
| Refresh | 使文档可搜索,写入内存段 | 否 |
| Flush | 将段写入磁盘,清空事务日志 | 是 |
API 的参数 #
路由参数 #
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
{index} | 字符串 | 否 | 要刷新的索引名称。支持:单个索引、逗号分隔的多个索引、通配符表达式、_all(所有索引) |
Query String 参数 #
| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
expand_wildcards | 枚举值 | 否 | open | 通配符展开选项。可选值:open、closed、hidden、none、all |
ignore_unavailable | 布尔值 | 否 | false | 是否忽略不可用的索引 |
allow_no_indices | 布尔值 | 否 | false | 当通配符没有匹配到索引时是否忽略 |
ignore_throttled | 布尔值 | 否 | false | 是否忽略被限流的索引 |
示例 #
刷新所有索引 #
POST /_refresh
响应示例:
{
"_shards": {
"total": 10,
"successful": 10,
"failed": 0
}
}
刷新单个索引 #
POST /my_index/_refresh
刷新多个索引 #
POST /index1,index2/_refresh
使用通配符刷新索引 #
POST /logs-*/_refresh
忽略不存在的索引 #
POST /index1,nonexistent/_refresh?ignore_unavailable=true
只刷新打开的索引(默认) #
POST /*/_refresh?expand_wildcards=open
刷新所有索引(包括关闭的) #
POST /*/_refresh?expand_wildcards=all
响应字段说明 #
| 字段 | 类型 | 描述 |
|---|---|---|
_shards.total | 整数 | 总分片数 |
_shards.successful | 整数 | 成刷新的分片数 |
_shards.failed | 整数 | 失败的分片数 |
自动刷新 #
默认情况下,Easysearch 会每隔 1 秒自动刷新索引。这个间隔可以通过索引设置修改:
PUT /my_index/_settings
{
"index.refresh_interval": "30s"
}
刷新间隔设置 #
| 值 | 描述 |
|---|---|
1s | 默认值,每秒刷新一次 |
30s | 每 30 秒刷新一次 |
-1 | 禁用自动刷新 |
禁用自动刷新 #
在某些场景下,如批量导入数据,可以临时禁用自动刷新以提高性能:
PUT /my_index/_settings
{
"index.refresh_interval": "-1"
}
导入完成后,重新启用刷新:
POST /my_index/_refresh
PUT /my_index/_settings
{
"index.refresh_interval": "1s"
}
使用场景 #
场景 1:批量导入后立即搜索 #
# 禁用自动刷新以提高导入性能
PUT /my_index/_settings
{
"index.refresh_interval": "-1"
}
# 执行批量导入
POST /_bulk
{ "index": { ... } }
{ ... }
...
# 导入完成后手动刷新
POST /my_index/_refresh
# 重新启用自动刷新
PUT /my_index/_settings
{
"index.refresh_interval": "1s"
}
场景 2:确保数据可搜索 #
# 索引文档
POST /my_index/_doc/1
{
"title": "test"
}
# 立即刷新以确保可搜索
POST /my_index/_refresh
# 搜索文档
GET /my_index/_search
{
"query": {
"match": {
"title": "test"
}
}
}
性能考虑 #
- 频繁刷新:会增加资源消耗和段数量
- 批量操作:建议在批量操作期间禁用自动刷新
- 段合并:频繁刷新会产生更多小段,需要合并
- 搜索延迟:自动刷新间隔越长,搜索可见延迟越大
注意事项 #
- Refresh 不等于持久化:刷新只使文档可搜索,不保证数据持久化
- 资源消耗:频繁刷新会增加 CPU 和 I/O 负载
- 段数量:过多刷新会产生大量小段,影响查询性能
- Translog:刷新不会清空事务日志,需要执行 Flush 操作





