php-elasticsearch scroll分页详解
背景
ps:首先我们在一个索引里面写入一万条以上的数据。作为数据源
现在我想看到第一万零一条数据,首先第一想法是,from 10000 size 1 ,这样做会包下面错误。显然是不成立的。此时便会用到scroll分页,
补充一点:from size分页,假如你要获取第1000到1010条数据,即from: 1000 size :10,它内部会先取出1-1010条数据,然后丢弃第1-1000条,保留最后十条并展示。
正文 :
(1)es内操作
第一步: index/type/_search?pretty&scroll=2m
此时会返回一个scroll值
第二步: 直接用scroll_id进行查询。
这样一步步的滚动查询就可以了
第三步 清除scroll
虽然我们在设置开启scroll时,设置了一个scroll的存活时间,但是如果能够在使用完顺手关闭,可以提早释放资源,降低ES的负担
DELETE 127.0.0.1:9200/_search/scroll { "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRVpSRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB" }
(2)php-elasticsearch scroll分页
public function index() { $page = $_REQUEST['page'] ?? 1; $size = $_REQUEST['size'] ?? 10; $searchParams=array( "index" => "eds_user_location", "type" => "info", // "search_type" => "QUERY_THEN_FETCH", "scroll" => "1m", "size" => $size, // "from" => $page*$size ); $searchParams['body'] = array( #查询条件 ); $docs = $this->client->search($searchParams); $scroll_id = $docs['_scroll_id']; $i=1; if($page == 1 ){ $this->ajaxReturn(array( 'code' => 1, 'data' => $docs['hits']['hits'] )); } while ($i < $page) { $response = $this->client->scroll( array( "scroll_id" => $scroll_id, "scroll" => "1m" ) ); if (count($response['hits']['hits']) > 0) { // Do Work Here // Get new scroll_id $scroll_id = $response['_scroll_id']; } else { break; } $i++; } $this->ajaxReturn(array( 'code' => 1, 'data' => $response['hits']['hits'] )); }