--- title: "创建 Point-in-time" date: 2026-01-29 lastmod: 2026-01-29 description: "介绍如何在 Easysearch 中创建 Point In Time (PIT) 上下文,用于在特定时间点的数据集上进行深度分页搜索。" tags: ["搜索", "点-in-time", "分页"] summary: "Point In Time (PIT) 是 Easysearch 中的一种搜索机制,允许在特定时间点上的数据集上进行搜索,而不是在实时数据集上搜索。PIT 是实现深度分页(deep pagination)的推荐方式。 API # POST /{index}/_pit API 的作用 # 创建 PIT 上下文,用于在冻结的数据集上进行搜索。PIT 的主要功能包括: 数据快照:锁定索引在特定时间点的段(segments)状态 深度分页:避免传统分页在深页时的性能问题和结果不准确 一致性搜索:在同一数据快照上执行多次不同查询 搜索结果稳定:避免搜索过程中数据变化导致的结果不一致 创建 PIT 后,可以在搜索时使用 PIT ID 而不需要指定索引名称。 API 的参数 # 路由参数 # 参数 类型 是否必需 描述 index string 必需 目标索引名称 支持: - 单个索引:my-index - 多个索引(逗号分隔):index1,index2 - 通配符:logs-* - 数据流:my-data-stream 查询字符串参数 # 参数 类型 是否必需 默认值 描述 keep_alive time 必需 无 PIT 的存活时间" --- Point In Time (PIT) 是 Easysearch 中的一种搜索机制,允许在特定时间点上的数据集上进行搜索,而不是在实时数据集上搜索。PIT 是实现深度分页(deep pagination)的推荐方式。 ## API ``` POST /{index}/_pit ``` ## API 的作用 创建 PIT 上下文,用于在冻结的数据集上进行搜索。PIT 的主要功能包括: - **数据快照**:锁定索引在特定时间点的段(segments)状态 - **深度分页**:避免传统分页在深页时的性能问题和结果不准确 - **一致性搜索**:在同一数据快照上执行多次不同查询 - **搜索结果稳定**:避免搜索过程中数据变化导致的结果不一致 创建 PIT 后,可以在搜索时使用 PIT ID 而不需要指定索引名称。 ## API 的参数 ### 路由参数 | 参数 | 类型 | 是否必需 | 描述 | |------|------|----------|------| | `index` | string | 必需 | 目标索引名称
支持:
- 单个索引:`my-index`
- 多个索引(逗号分隔):`index1,index2`
- 通配符:`logs-*`
- 数据流:`my-data-stream` | ### 查询字符串参数 | 参数 | 类型 | 是否必需 | 默认值 | 描述 | |------|------|----------|--------|------| | `keep_alive` | time | **必需** | 无 | PIT 的存活时间
每次使用 PIT 搜索时会延长该时间
建议值:`1m`, `5m`, `1h` 等 | | `allow_partial_pit_creation` | boolean | 可选 | `true` | 是否允许部分失败时创建 PIT
`true`:部分索引失败时仍创建 PIT
`false`:任何索引失败时整个操作失败 | | `preference` | string | 可选 | 随机 | 指定执行搜索的节点或分片
`_local`:优先使用本地节点
`_primary`:只查询主分片 | | `routing` | string | 可选 | 文档的 `_id` | 将搜索请求路由到特定分片 | | `expand_wildcards` | string | 可选 | `open` | 通配符可匹配的索引类型
`open`:开放状态的索引
`closed`:已关闭的索引
`hidden`:隐藏的索引
`none`:不展开通配符
`all`:所有状态的索引
可使用逗号分隔多个值 | ## 请求示例 ### 基本请求 ```bash # 创建 PIT,存活 1 小时 POST /my-index/_pit?keep_alive=1h ``` ### 带完整参数的请求 ```bash # 创建 PIT,存活 10 分钟,不允许部分失败 POST /logs-*/_pit?keep_alive=10m&allow_partial_pit_creation=false ``` ### 多个索引 ```bash # 为多个索引创建 PIT POST /index1,index2,index3/_pit?keep_alive=30m ``` ### 数据流 ```bash # 为数据流创建 PIT POST /my-data-stream/_pit?keep_alive=1h ``` ## 响应示例 ### 成功响应 ```json { "pit_id": "o463QQEPbXktaW5kZXgtMDAwMDAxFnNOWU43ckt3U3IyaFVpbGE1UWEtMncAFjFyeXBsRGJmVFM2RTB6eVg1aVVqQncAAAAAAAAAAAIWcDVrM3ZIX0pRNS1XejE5YXRPRFhzUQEWc05ZTjdyS3dTcjJoVWlsYTVRYS0ydwAA", "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "creation_time": 1707033600000 } ``` ### 响应字段说明 | 字段 | 类型 | 描述 | |------|------|------| | `pit_id` | string | Base64 编码的 PIT ID,用于后续搜索操作 | | `_shards.total` | integer | 涉及的分片总数 | | `_shards.successful` | integer | 成功创建 PIT 的分片数量 | | `_shards.failed` | integer | 创建 PIT 失败的分片数量 | | `creation_time` | long | PIT 创建的时间戳(毫秒) | ## 使用 PIT 进行搜索 创建 PIT 后,可以在搜索中使用 PIT ID: ```json GET /_search { "pit": { "id": "o463QQEPbXktaW5kZXgtMDAwMDAxFnNOWU43ckt3U3IyaFVpbGE1UWEtMncAFjFyeXBsRGJmVFM2RTB6eVg1aVVqQncAAAAAAAAAAAIWcDVrM3ZIX0pRNS1XejE5YXRPRFhzUQEWc05ZTjdyS3dTcjJoVWlsYTVRYS0ydwAA", "keep_alive": "1m" }, "query": { "match_all": {} }, "size": 1000, "sort": [ {"_shard_doc": "asc"} ] } ``` ### 深度分页示例 使用 PIT 和 `search_after` 实现深度分页: ```json GET /_search { "pit": { "id": "pit_id_here", "keep_alive": "5m" }, "query": { "match": { "message": "error" } }, "size": 100, "sort": [ {"@timestamp": "asc"}, {"_shard_doc": "asc"} ], "search_after": [1707033600000, "shard_doc_value"] } ``` ## PIT 生命周期管理 ### 自动过期 - PIT 在 `keep_alive` 时间后自动过期 - 每次使用 PIT 搜索时会延长 `keep_alive` 时间 ### 手动删除 使用 [删除 point-in-time](./delete-point-in-time.md) API 手动删除 PIT: ```json DELETE /_pit { "pit_id": ["pit_id_1", "pit_id_2"] } ``` ## PIT vs 传统分页 | 特性 | 传统分页 (from/size) | PIT + search_after | |------|---------------------|-------------------| | 深度分页支持 | 差(深页性能差) | 优秀 | | 结果一致性 | 数据变化时可能重复或遗漏 | 一致的数据快照 | | 性能 | 深页时需要排序和丢弃大量结果 | 恒定性能 | | 内存使用 | 需要维护深度优先游标 | 维护轻量级 PIT 上下文 | ## 使用场景 1. **深度分页**:需要浏览超过 10000 条结果 2. **一致性导出**:需要导出完整的数据集 3. **批量处理**:分批处理大量数据 4. **数据分析**:对同一时间点的数据进行多次分析 ## 注意事项 1. **keep_alive 是必需参数**:创建 PIT 时必须指定存活时间 2. **定期刷新**:长时间使用 PIT 时,需定期搜索以延长存活时间 3. **内存管理**:未使用的 PIT 会占用内存,建议及时删除 4. **ID 保密**:PIT ID 包含索引信息,不应泄露给未授权用户 5. **不支持查询字符串参数**:所有参数必须通过查询字符串传递,不能使用请求体 ## 相关文档 - [删除 point-in-time](./delete-point-in-time.md) - [搜索文档](./search-document.md)