Elasticsearch,使用scroll实现遍历(分页)查询

为什么要使用 scroll 查询

在使用 es 中,当某个 index 存贮的数据超过 10000 时,只能查询到 10000 的数据。因为 index.max_result_window 默认值是 10000。并且使用游标查询可以在一次查询中获取大量文档,并且保持查询快照状态,允许用户多次检索数据而不影响其他并发请求。

scroll 查询的主要意义

  1. 处理大量数据:大量导出数据、批量处理数据等。
  2. 避免深度分页问题:普通分页可能会导致性能下降,当分页数量增加,跳过文档增加,性能也会降低。而 scroll 避免此问题。
  3. 快照保存:游标保持一个快照状态,允许用户在快照有效期内多次滚动检索,提高效率。
  4. 数据一致性:游标查询可以确保整个查询结果的一致性,即使在处理大量文档时,也不会错过新增或删除的文档。

如何使用 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作为下一次的参数。
所以在代码中可以使用循环来获取所有数据。
当数据请求完成后,就结束循环。

posted @ 2024-04-08 10:32  急鲨车  阅读(42)  评论(0编辑  收藏  举报