Elasticsearch Search Scroll API 查询全量数据

当Elasticsearch的SearchAPI检索结果超过10000条时,可使用SearchScrollAPI进行分批查询。该API通过scroll_id持续滚动获取数据,每次请求指定scroll时间间隔,直至获取所有匹配文档。在完成滚动搜索后,记得使用ClearScrollAPI清理上下文以释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch Search Scroll API 查询全量数据

Elasticsearch 的 Search API 最多只能返回 10000 条检索结果,需要更多检索结果时,就要用到 Search Scroll API 了。

Search Scroll API 就像鼠标的滚轮一样,通过不断地向下滚动直到文档的 ending,从而查询全量结果。

全量文档的查询通常比较耗时,我们需要在请求体中传入过期时间参数 scroll

在这里插入图片描述

注意到返回结果中有一个字段 _scroll_id,它记录了保持活动状态的搜索上下文,其中当然也包括当前获取记录的偏移量。

每当准备发起获取新一批次数据的请求时,就要传入上一次请求结果中获取的 scroll_id,告知 es 上一次数据取到哪里了,新一批数据从哪里开始取:

在这里插入图片描述

返回结果中还包括字段 _scroll_id,是取下一批数据用的,以此类推,直到获取全量数据。

初始化

在这里插入图片描述

  1. 创建 SearchRequest,以及相应的 SearchSourceBuilder. 也可以通过设置 size 控制返回结果数;

  2. 设置滚动查询间隔,时间间隔的设定方法有以下两种:
    在这里插入图片描述

  3. 返回的结果中包含一个 scrol id 字段,这个字段干嘛的呢?它记录的是当前保持活动状态的搜索 session 的上下文,在接下来的 search scroll 中将会用到;

  4. 获取第一批检索结果;

获取检索结果

第二步,我们发起的 request 不再是一个 SearchRequest,而是一个 SearchScrollRequest,SearchScrollRequest 中需要设定的参数包括:

  1. 上一步骤中返回的 scroll id,这个标识符中保存着 scroll search 的上下文信息,使得检索过程可以从上一次的结束位置继续;
  2. 新的 scroll 时间间隔;

Elasticsearch 返回具有新滚动标识符的另一批结果。 然后,可以在随后的 SearchScrollRequest 中使用此新的滚动标识符来检索下一批结果,依此类推。 应该循环执行此过程,直到没有更多结果返回为止,这意味着滚动已用尽,并且所有匹配的文档都已被获取。

在这里插入图片描述

  1. 通过设置 scroll id 和 scroll interval 来创建 ScrollSearchRequest;
  2. 阅读新的滚动 ID,它指向保持活动状态的搜索上下文,在接下来的 Search Scroll 调用中将用到它;
  3. 获取新一批次的检索结果;

清理上下文

最后,可以使用 Clear Scroll API 删除最后一个滚动标识符,以释放搜索上下文。 尽管滚动过期后会自动清理,但最好的做法是在滚动会话结束后立即进行,释放掉不再占用的资源。

同步请求

在这里插入图片描述

异步请求

异步执行搜索滚动请求需要将SearchScrollRequest实例和ActionListener实例传递给异步方法:
在这里插入图片描述
异步请求的响应不会立即返回。请求返回时会回调 ActionListener,如果执行成功完成,则使用 onResponse 方法回调ActionListener;如果执行失败,则使用 onFailure 方法回调 ActionListener。

在这里插入图片描述

  1. 执行成功完成时调用,响应作为参数提供;
  2. 执行失败时调用,异常作为参数提供;

完整示例

滚动搜索的完整示例代码如下:
在这里插入图片描述

  1. 通过发送初始 SearchRequest 初始化搜索上下文;
  2. 通过在循环中调用 Search Scroll API 来检索所有的搜索结果,直到没有返回任何文档;
  3. 处理搜索结果;
  4. 根据上一次返回的 scroll id 和时间间隔创建新的 SearchScrollRequest;
  5. 滚动搜索结束后,清理上下文;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值