Elasticsearch PHP API滚动查询报错:Unknown key for a VALUE_STRING in [scroll]
解决Elasticsearch PHP滚动查询报错:Unknown key for a VALUE_STRING in [scroll]
这个错误我之前帮不少开发者排查过,核心原因大多是PHP客户端与Elasticsearch服务端的版本不兼容,导致scroll参数的位置不符合服务端的解析规则。下面给你两种可行的解决方案:
方案一:对齐客户端与服务端版本(推荐)
Elasticsearch的API参数结构在不同大版本(比如6.x→7.x→8.x)里有不少变化,官方文档的示例都是对应当前客户端版本的。所以最稳妥的办法是确保你的PHP客户端版本和ES服务端版本完全匹配:
- 比如服务端是7.17,就用
composer require elasticsearch/elasticsearch:^7.17安装对应版本的客户端 - 版本对齐后,你原本按照官方文档写的代码就能正常运行,不用做任何参数调整
方案二:临时调整参数位置(针对无法立即升级/降级的场景)
如果暂时没法调整版本,可以根据你的ES服务端版本修改参数结构:
若服务端是6.x及更早版本
这个版本的ES要求scroll和size参数必须放在body数组内部,修正后的代码如下:
$client = ClientBuilder::create()->build(); $params = [ "index" => "my_index", "body" => [ "scroll" => "30s", // 移到body中 "size" => 50, // size参数同样移到body里 "query" => [ "match_all" => new \stdClass() ] ] ]; // 执行初始搜索 $response = $client->search($params); $scrollId = $response['_scroll_id']; // 循环滚动查询 while (true) { $response = $client->scroll([ 'scroll_id' => $scrollId, 'scroll' => '30s' ]); // 没有更多结果时退出循环 if (count($response['hits']['hits']) === 0) { break; } // 处理每一条查询结果 foreach ($response['hits']['hits'] as $hit) { // 这里写你的业务逻辑 } // 更新scroll ID $scrollId = $response['_scroll_id']; } // 清理scroll上下文,避免占用ES资源 $client->clearScroll(['scroll_id' => $scrollId]);
若服务端是7.x及以上版本
先检查代码里的参数拼写(比如有没有把scroll写成scoll),然后确认客户端版本是否和服务端匹配。如果版本一致,你原本的代码结构是对的,可能是其他配置问题(比如客户端连接的地址不对、权限问题),可以先排查这些基础项。
最后提醒一句:滚动查询结束后一定要调用clearScroll,不然ES会一直保留scroll上下文,时间长了会占用大量内存哦!
内容的提问来源于stack exchange,提问作者vvr02
相关产品推荐
相关产品推荐

