为什么要使用 scroll 查询
在使用 es 中,当某个 index 存贮的数据超过 10000 时,只能查询到 10000 的数据。因为 index.max_result_window 默认值是 10000。并且使用游标查询可以在一次查询中获取大量文档,并且保持查询快照状态,允许用户多次检索数据而不影响其他并发请求。
scroll 查询的主要意义
- 处理大量数据:大量导出数据、批量处理数据等。
- 避免深度分页问题:普通分页可能会导致性能下降,当分页数量增加,跳过文档增加,性能也会降低。而 scroll 避免此问题。
- 快照保存:游标保持一个快照状态,允许用户在快照有效期内多次滚动检索,提高效率。
- 数据一致性:游标查询可以确保整个查询结果的一致性,即使在处理大量文档时,也不会错过新增或删除的文档。
如何使用 scroll 对 es 进行查询(python 示例)
第一步
进行GET请求查询,返回结果中会多一个scroll_id,该id是有时效性。
GET demo/_search?scroll=1m
{
"query": {
"match_all": {}
}
}
第二步
将请求体中修改成scroll和scroll_id的形式,请求内容会根据第一次请求。
GET demo/_search/scroll
{
"scroll":"1m",
"scroll_id":[scroll_id]
}
返回一个新的scroll_id,作为下一次请求参数。
第三(n)步
如同第二步,不过每一次都要把上一次请求返回的的scroll_id作为下一次的参数。
所以在代码中可以使用循环来获取所有数据。
当数据请求完成后,就结束循环。