You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用matchory/elasticsearch时如何获取scroll_id?

解决matchory/elasticsearch包的Scroll API使用问题

当你用take()+skip()查询大量数据时,Elasticsearch默认的10000条结果窗口限制会触发报错,这时候Scroll API是标准解决方案。下面是matchory/elasticsearch包中Scroll查询的完整使用流程,包括scroll_id的获取与循环查询:

1. 初始化Scroll查询,获取初始scroll_id

先发起第一个Scroll请求,设置会话有效期和单次返回的文档数量,同时拿到初始的scroll_id:

// 替换成你的模型类
use App\Models\YourModel;
use Matchory\Elasticsearch\Elasticsearch;

// 初始化Scroll查询:设置1分钟会话有效期,每次返回1000条数据
$scrollResult = Elasticsearch::query()
    ->model(YourModel::class)
    ->scroll('1m') // 控制会话有效期,避免过长占用Elasticsearch资源
    ->size(1000) // 单次批量获取的文档数,建议1000-5000,平衡性能与内存
    ->get();

// 提取初始scroll_id
$scrollId = $scrollResult->getScrollId();

// 处理第一批返回的数据
$batchDocuments = $scrollResult->getDocuments();
foreach ($batchDocuments as $doc) {
    // 业务逻辑示例:访问文档字段 $doc->your_field_name
}

2. 循环使用scroll_id获取剩余数据

通过已拿到的scroll_id持续请求,直到没有更多数据返回:

while (true) {
    // 用scroll_id请求下一批数据
    $scrollResult = Elasticsearch::query()
        ->scroll('1m')
        ->scrollId($scrollId)
        ->get();

    $batchDocuments = $scrollResult->getDocuments();
    
    // 无更多数据时退出循环
    if (empty($batchDocuments)) {
        break;
    }

    // 处理当前批次数据
    foreach ($batchDocuments as $doc) {
        // 执行你的业务操作
    }

    // 更新scroll_id(部分Elasticsearch版本会在每次请求后生成新的id)
    $scrollId = $scrollResult->getScrollId();
}

3. 清理Scroll会话(必做)

所有数据处理完成后,务必清除Scroll会话,避免Elasticsearch保留无用的上下文资源:

Elasticsearch::query()->clearScroll($scrollId);

关键注意事项

  • 有效期设置:scroll()的参数(如1m)是会话有效期,建议根据数据量设置1-5分钟,不要过长
  • 批量大小:size()不要设置过大,否则可能导致内存溢出,1000-5000是比较均衡的选择
  • scroll_id更新:每次请求后都要重新获取scroll_id,部分Elasticsearch版本会在每次请求后生成新的id

内容的提问来源于stack exchange,提问作者Nikolay kitsul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:38:21