1. 程式人生 > >php-elasticsearch scroll分頁詳解

php-elasticsearch scroll分頁詳解

ams req fetch cse psr 數據 ons alt docs

背景

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‘] )); }

php-elasticsearch scroll分頁詳解