Scroll
当搜索请求返回结果的单个页面时,scroll API可以用于从单个搜索请求中检索大量结果(甚至所有的结果),类似于在传统数据库中使用游标。
滚动的用途不是实时响应用户请求,而是处理大规模数据。eg:将一个索引的内容reindex到另一个拥有不同配置的索引中。
由一个滚动请求返回的结果反映了初始搜索请求发送时索引的状态,类似于快照。之后对文档的改变只能影响之后的搜索请求。
搜索请求(开启滚动)
GET /bank/_search?scroll=1m
{
"size": 100,
"query": {
"match_all": {}
}
}
note:返回一百个文档,剩余结果保存1m。
note:滚动请求会返回一个scroll_id字段,使用此字段获取剩余的查询结果。
滚动搜索
GET /_search/scroll
{
"scroll": "1m",
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADhFk1CcGFVbW1PVDVHbDQzaXFlZGI4OGcAAAAAAAAA3xZNQnBhVW1tT1Q1R2w0M2lxZWRiODhnAAAAAAAAAN4WTUJwYVVtbU9UNUdsNDNpcWVkYjg4ZwAAAAAAAADgFk1CcGFVbW1PVDVHbDQzaXFlZGI4OGcAAAAAAAAA3RZNQnBhVW1tT1Q1R2w0M2lxZWRiODhn"
}
note:获取下一个一百个文档。
note:剩余文档再多存活1m。
size参数允许配置每批返回的命中的最大数量。每次对scroll API的调用都会返回下一批结果,直到所有的结果被返回,即hits数组为空。
初始搜索请求与接下来的每次滚动请求都返回一个_scroll_id。虽然_scroll_id可能会在请求间改变,但是它在任何情况下都不会被更改,应该使用最近接收的_scroll_id。
如果请求指定了聚合,只有初始搜索响应会包含聚合结果。
如果排序顺序为_doc,滚动请求具有更快的优化。
迭代所有文档(高效)
GET /_search?scroll=1m
{
"sort": [
"_doc"
]
}
保证搜索上下文存活
scroll参数告知Elasticsearch应该保证搜索上下文存活的时间。它的值不需要长到足以处理所有的数据,它只需要长到足够处理上一批结果,每一次滚动请求(包含scroll参数)都会设置新的终结时间。
通常情况下,后台合并进程通过合并较小段来创建较大块来优化索引,在此期间,较小段会被删除。在滚动期间,这个过程也会进行,但是当旧的段被使用时,一个打开的搜索上下文会阻止其被删除。这就是即使之后对文档进行了修改,Elasticsearch仍可以返回最初搜索请求的原因。
保持旧段存活意味着需要更多的文件句柄。确保配置的节点拥有充足的空闲文件句柄。
删除滚动(单个)
DELETE /_search/scroll
{
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
删除所有滚动
DELETE /_search/scroll/_all