滚动
1.0 版引入
您可以使用 scroll
操作检索大量结果。例如,对于机器学习任务,您可以分批请求无限数量的结果。
要使用 scroll
操作,请在请求头中添加一个 scroll
参数,其中包含一个搜索上下文,以告知 OpenSearch 您需要滚动多长时间。此搜索上下文需要足够长以处理单个批次的结果。
由于搜索上下文会消耗大量内存,我们建议您不要将 scroll
操作用于频繁的用户查询。相反,请使用 sort
参数与 search_after
参数来滚动用户查询的响应。
端点
GET _search/scroll
POST _search/scroll
GET _search/scroll/<scroll-id>
POST _search/scroll/<scroll-id>
路径参数
参数 | 类型 | 描述 |
---|---|---|
scroll_id | 字符串 | 搜索的滚动 ID。 |
查询参数
所有滚动参数均为可选。
参数 | 类型 | 描述 |
---|---|---|
scroll | 时间 | 指定搜索上下文的维护时间。 |
scroll_id | 字符串 | 搜索的滚动 ID。 |
rest_total_hits_as_int | 布尔型 | 将 hits.total 属性作为整数 (true ) 还是对象 (false ) 返回。默认值为 false 。 |
示例请求
要设置每个批次要返回的结果数量,请使用 size
参数
GET shakespeare/_search?scroll=10m
{
"size": 10000
}
OpenSearch 缓存结果并返回一个滚动 ID 以批处理方式访问它们
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAUWdmpUZDhnRFBUcWFtV21nMmFwUGJEQQ=="
将此滚动 ID 传递给 scroll
操作以获取下一批结果
GET _search/scroll
{
"scroll": "10m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAUWdmpUZDhnRFBUcWFtV21nMmFwUGJEQQ=="
}
只要搜索上下文仍处于打开状态,使用此滚动 ID,您将以 10,000 个结果的批次获取结果。通常,滚动 ID 在请求之间不会改变,但它可能改变,因此请务必始终使用最新的滚动 ID。如果您未在设置的搜索上下文时间内发送下一个滚动请求,scroll
操作将不会返回任何结果。
如果您期望数十亿结果,请使用切片滚动。切片允许您对同一个请求执行多个滚动操作,但以并行方式。设置滚动 ID 和最大切片数
GET shakespeare/_search?scroll=10m
{
"slice": {
"id": 0,
"max": 10
},
"query": {
"match_all": {}
}
}
使用单个滚动 ID,您将获得 10 个结果。您最多可以有 10 个 ID。
完成滚动后关闭搜索上下文,因为 scroll
操作会持续消耗计算资源直到超时
DELETE _search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAcWdmpUZDhnRFBUcWFtV21nMmFwUGJEQQ==
要关闭所有打开的滚动上下文
DELETE _search/scroll/_all
scroll
操作对应于一个特定时间戳。它不考虑在该时间戳之后添加的文档作为潜在结果。
示例响应
{
"succeeded": true,
"num_freed": 1
}