--- title: "刷新索引" date: 2026-02-14 lastmod: 2026-02-14 description: "刷新索引,使最近的文档更新对搜索可见" tags: ["索引管理", "索引操作", "搜索"] summary: "刷新索引,使自上次刷新以来执行的所有操作对搜索可见。 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 响应示例:" --- 刷新索引,使自上次刷新以来执行的所有操作对搜索可见。 ## 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 | 是否忽略被限流的索引 | ## 示例 ### 刷新所有索引 ```bash POST /_refresh ``` **响应示例:** ```json { "_shards": { "total": 10, "successful": 10, "failed": 0 } } ``` ### 刷新单个索引 ```bash POST /my_index/_refresh ``` ### 刷新多个索引 ```bash POST /index1,index2/_refresh ``` ### 使用通配符刷新索引 ```bash POST /logs-*/_refresh ``` ### 忽略不存在的索引 ```bash POST /index1,nonexistent/_refresh?ignore_unavailable=true ``` ### 只刷新打开的索引(默认) ```bash POST /*/_refresh?expand_wildcards=open ``` ### 刷新所有索引(包括关闭的) ```bash POST /*/_refresh?expand_wildcards=all ``` ## 响应字段说明 | 字段 | 类型 | 描述 | |------|------|------| | `_shards.total` | 整数 | 总分片数 | | `_shards.successful` | 整数 | 成刷新的分片数 | | `_shards.failed` | 整数 | 失败的分片数 | ## 自动刷新 默认情况下,Easysearch 会每隔 1 秒自动刷新索引。这个间隔可以通过索引设置修改: ```bash PUT /my_index/_settings { "index.refresh_interval": "30s" } ``` ### 刷新间隔设置 | 值 | 描述 | |----|------| | `1s` | 默认值,每秒刷新一次 | | `30s` | 每 30 秒刷新一次 | | `-1` | 禁用自动刷新 | ### 禁用自动刷新 在某些场景下,如批量导入数据,可以临时禁用自动刷新以提高性能: ```bash PUT /my_index/_settings { "index.refresh_interval": "-1" } ``` 导入完成后,重新启用刷新: ```bash POST /my_index/_refresh PUT /my_index/_settings { "index.refresh_interval": "1s" } ``` ## 使用场景 ### 场景 1:批量导入后立即搜索 ```bash # 禁用自动刷新以提高导入性能 PUT /my_index/_settings { "index.refresh_interval": "-1" } # 执行批量导入 POST /_bulk { "index": { ... } } { ... } ... # 导入完成后手动刷新 POST /my_index/_refresh # 重新启用自动刷新 PUT /my_index/_settings { "index.refresh_interval": "1s" } ``` ### 场景 2:确保数据可搜索 ```bash # 索引文档 POST /my_index/_doc/1 { "title": "test" } # 立即刷新以确保可搜索 POST /my_index/_refresh # 搜索文档 GET /my_index/_search { "query": { "match": { "title": "test" } } } ``` ## 性能考虑 1. **频繁刷新**:会增加资源消耗和段数量 2. **批量操作**:建议在批量操作期间禁用自动刷新 3. **段合并**:频繁刷新会产生更多小段,需要合并 4. **搜索延迟**:自动刷新间隔越长,搜索可见延迟越大 ## 注意事项 1. **Refresh 不等于持久化**:刷新只使文档可搜索,不保证数据持久化 2. **资源消耗**:频繁刷新会增加 CPU 和 I/O 负载 3. **段数量**:过多刷新会产生大量小段,影响查询性能 4. **Translog**:刷新不会清空事务日志,需要执行 Flush 操作