php-elasticsearch scroll分頁詳解
阿新 • • 發佈:2019-04-22
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分頁詳解