Elasticsearch search_after 和 scroll详解

dalang · · 109 次点击 · · 开始浏览    
--- ### **1. `scroll` API** - **设计目的**: 用于**长时间遍历大量数据**(如全量数据导出),生成数据快照(Snapshot),保证遍历期间数据一致性。 - **核心机制**: - **快照上下文**:首次请求创建 `scroll_id`,Elasticsearch 在内存/磁盘中维护数据快照(默认存活时间 `5m`)。 - **顺序遍历**:每次使用 `scroll_id` 获取下一批数据,直到数据遍历完成。 - **资源开销**:快照会占用资源(内存和文件句柄),长时间未释放可能导致集群压力。 - **示例**: ```bash # 初始化 Scroll GET /index/_search?scroll=5m { "size": 100, "query": { "match_all": {} } } # 后续遍历(使用返回的 scroll_id) GET /_search/scroll { "scroll": "5m", "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" } ``` - **适用场景**: - 全量数据导出(如备份、迁移)。 - 需要保证遍历期间数据一致性(快照隔离)。 - **限制**: - 快照数据不实时(后续写入不影响遍历结果)。 - 资源消耗高,不适合高并发或实时分页。 --- ### **2. `search_after`** - **设计目的**: 用于**高性能深度分页**(如跳转到第 1000 页),基于排序字段直接定位数据,无需快照。 - **核心机制**: - **无状态分页**:每次请求携带上一页最后一条的排序值(`search_after`参数),直接定位下一页起始点。 - **实时性**:查询时直接访问最新数据,无快照隔离(需结合 `PIT` 保证一致性)。 - **轻量级**:无长期资源占用,适合高并发场景。 - **示例**: ```bash # 首次查询(必须指定唯一排序字段) GET /index/_search { "size": 100, "query": { "match_all": {} }, "sort": [ { "timestamp": "desc" }, { "_id": "asc" } # 确保排序唯一性 ] } # 后续分页(使用上一页最后一条的排序值) GET /index/_search { "size": 100, "query": { "match_all": {} }, "sort": [ { "timestamp": "desc" }, { "_id": "asc" } ], "search_after": ["2023-10-01T12:00:00", "doc123"] } ``` - **适用场景**: - 实时深度分页(如用户翻页到第 1000 条)。 - 需要高并发、低延迟的分页查询。 - **限制**: - 必须指定唯一排序字段(如 `_id` 防止分页重复)。 - 需结合 `PIT(Point-in-Time)` 保证分页期间数据一致性(避免写入导致分页错乱)。 --- ### **3. 关键差异对比** | **特性** | **`scroll` API** | **`search_after`** | |------------------------|-------------------------------------------|-----------------------------------------| | **数据一致性** | 快照隔离(数据冻结) | 实时查询(需结合 `PIT` 保证一致性) | | **资源占用** | 高(维护快照上下文) | 低(无状态) | | **实时性** | 数据不实时(基于快照) | 数据实时 | | **适用场景** | 全量数据导出、离线分析 | 实时深度分页、高并发查询 | | **排序要求** | 无特殊要求 | 必须指定唯一排序字段 | | **分页方式** | 顺序遍历(不可跳页) | 可逐页顺序遍历 | | **性能** | 适合大数据量但延迟较高 | 适合实时场景,延迟低 | --- ### **4. 如何选择?** - **用 `scroll` 的场景**: - 需要导出全部数据(如备份)。 - 允许数据非实时(快照隔离)。 - 接受较高的资源开销。 - **用 `search_after` 的场景**: - 需要实时分页(如用户界面逐页翻页)。 - 高并发、低延迟需求。 - 结合 `PIT` 保证分页期间数据一致性。 - **用 `PIT + search_after` 的场景**: - 需要实时性 + 数据一致性(例如分页过程中有新数据写入)。 --- ### **5. 性能对比示例** - **`scroll`**: - 导出 100 万条数据,耗时约 2 分钟,但集群内存占用高。 - **`search_after`**: - 跳转到第 1000 页(每页 100 条),耗时约 50ms,资源占用几乎为零。 --- ### **总结** - `scroll` 是**离线遍历工具**,适合大数据量导出,牺牲实时性换取一致性。 - `search_after` 是**实时分页工具**,适合深度分页和高并发场景,需注意排序唯一性和数据一致性。 - 两者互补,根据业务需求选择即可。
109 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传